1

我在网上没有找到任何东西,所以我在这里问。

有没有办法创建只需要用户名的自定义身份验证?这意味着登录到一个特定的子页面只需要输入用户名,没有电子邮件和密码等?

还是有更好的方法来做到这一点?例如,只有当用户名(或类似用户名)存在于数据库表中时才能访问子页面?

4

3 回答 3

1

是的,你可以这样做:

(在模型文件中,或者在控制器的顶部,或者更好地制作一个函数装饰器)

检查session.logged_in_user它是否为无,如果为无,则重定向到 /default/login,在其中向用户提供表单:

form = FORM(Field('username'), requires=IS_IN_DB(db, db.users.username))

在提交表单时(请参阅 web2py 表单处理手册),如果有效(例如,如果用户名存在于 db.users 表中),设置session.logged_in_user = request.vars.username

这是一个完整的示例(未经测试):

模型/Auth.py

# Could also check whether session.logged_in_user exists in DB, but probably not needed
# If so though, should be renamed zAuth or something to come after db.py file
if not session or not session.logged_in_user:
  redirect(URL('default','login', vars={'next':request.vars.url}))

控制器/default.py

#in file: controllers/default.py
...
def login():
   form = FORM(Field('username', requires=IS_IN_DB(db, db.users.username))

   if form.process().accepted:
     session.logged_in_user = form.vars.username
     redirect(request.vars.next)
   elif form.errors:
     session.logged_in_user = None # not necessary, but oh well
     response.flash = "Please enter a valid username"

   return dict(form=form)

意见/默认/login.html

{{ extend 'layout.html' }}
{{ =form }}

通过将代码放在模型文件中,您可以确保在每个页面请求上都执行它。

这将不允许您使用 web2py 的身份验证机制(即auth = AUTH()),但我不确定您是否想要它,除非您对使用组和权限等感兴趣。但如果是这种情况,请添加密码(即使它是通用密码或空白密码)似乎不会太麻烦。

于 2012-12-28T17:28:41.797 回答
1

web2py 默认允许空白密码。因此,只需使用 CSS 隐藏登录和注册表单中的密码字段即可。您应该能够使用默认身份验证。

于 2013-01-07T19:42:05.233 回答
0

如果您只想使用您唯一的用户名和密码登录,请转到 db.py 并编写以下代码:

auth.define_tables(username=True,signature=True)
db.auth_user.username.requires = IS_NOT_IN_DB(db, 'auth_user.username')
db.auth_user.email.readable = False
db.auth_user.email.writable = False
db.auth_user.first_name.readable = False
db.auth_user.first_name.writable = False
db.auth_user.last_name.readable = False
db.auth_user.last_name.writable = False

对我来说它有效

于 2020-01-20T15:01:56.263 回答