【问题标题】:Web2Py minimal User authentication (username only)Web2Py 最小用户身份验证(仅用户名)
【发布时间】:2020-01-20 23:01:56
【问题描述】:

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

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

或者有更好的方法吗?例如。只有用户名(或类似用户名)存在于 db 表中时才能访问子页面?

【问题讨论】:

  • 我想你有一个初始授权?您不能按组限制对子页面的访问吗?本质上,将用户添加到数据库中的组,然后按组限制对子页面的访问?

标签: python database authentication web2py


【解决方案1】:

是的,你可以这样做:

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

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

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

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

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

models/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}))

controllers/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)

views/default/login.html

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您只想使用唯一的用户名和密码登录,请转到 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-08-29
        • 1970-01-01
        • 2021-03-28
        • 1970-01-01
        • 1970-01-01
        • 2016-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多