我在网上没有找到任何东西,所以我在这里问。
有没有办法创建只需要用户名的自定义身份验证?这意味着登录到一个特定的子页面只需要输入用户名,没有电子邮件和密码等?
还是有更好的方法来做到这一点?例如,只有当用户名(或类似用户名)存在于数据库表中时才能访问子页面?
我在网上没有找到任何东西,所以我在这里问。
有没有办法创建只需要用户名的自定义身份验证?这意味着登录到一个特定的子页面只需要输入用户名,没有电子邮件和密码等?
还是有更好的方法来做到这一点?例如,只有当用户名(或类似用户名)存在于数据库表中时才能访问子页面?
是的,你可以这样做:
(在模型文件中,或者在控制器的顶部,或者更好地制作一个函数装饰器)
检查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()
),但我不确定您是否想要它,除非您对使用组和权限等感兴趣。但如果是这种情况,请添加密码(即使它是通用密码或空白密码)似乎不会太麻烦。
web2py 默认允许空白密码。因此,只需使用 CSS 隐藏登录和注册表单中的密码字段即可。您应该能够使用默认身份验证。
如果您只想使用您唯一的用户名和密码登录,请转到 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
对我来说它有效