首页 文章

web2py检查表单中的密码

提问于
浏览
0

我正在尝试在web2py中创建更改密码表单 . 我正在使用db.auth_user表 . 我想创建一个包含字段['current_password','new_password','repeat_password']的表单

如果未正确输入密码,表单应向用户发出警告 .

我的代码是:

request.vars.current_password = request.vars.current_password if request.vars.current_password else 'xxx'

user_password_form = SQLFORM.factory(Field('current_password', 'password', 
                                           requires=IS_EQUAL_TO(db(db.auth_user.id == auth.user_id).select('password').first().password)(
                                                                str(db.auth_user.password.validate(request.vars.current_password)[0]))),
                                     Field('new_password', 'password'),
                                     Field('repeat_password', 'password',
                                           requires=IS_EQUAL_TO(request.vars.new_password,
                                                                'Passwords do not match')))

我已经测试了以下代码的验证,如果输入正确,则设置a = 1 . 但在表单验证中,我无法弄清楚如何实现它

if request.vars.current_password:
        if db.auth_user.password.validate(request.vars.current_password)[0] == db(
                        db.auth_user.id == auth.user_id).select('password').first().password:
            a=1

有关如何实现密码验证的任何想法?

1 回答

  • 1

    web2py Auth系统包含内置密码更改操作 . 如果您在 default.py 控制器中使用默认的 user 操作,则可以通过/ myapp / default / user / change_password访问此表单 .

    如果您希望仅为此目的创建单独的控制器操作,则可以执行以下操作:

    def change_password():
        return dict(form=auth.change_password())
    

    并在相关的视图中:

    {{=form}}
    

    关于你的自定义代码,你不能单独使用 IS_EQUAL_TO 验证器,因为它需要一个表达式必须等于表单提交的值(你不能像你一样调用带有转换值的验证器,因为它会返回一个元组,但 requires 属性必须是一个可调用的对象,它接受一个字段和一个值) .

    相反,您可以在列表中使用 CRYPT 验证器,然后使用 IS_EQUAL_TO 验证器 - 第一个验证器将提交的密码转换为散列,然后第二个将测试与存储的密码散列的相等性 .

    或者,您可以使用:

    def check_password(password):
        new_hash = db.auth_user.password.validate(password)[0]
        return new_hash == auth.user.password
    
    form = SQLFORM.factory(Field('current_password', 'password')
                                 requires=IS_EXPR(check_password)),
                           ...)
    

    IS_EXPR 验证器可以接受一个将传递该值的函数,该函数应返回 TrueFalse (注意,此用法未记录 - 本书仅显示了替代用法,其中您将Python代码作为字符串提供,其中将是 exec'ed ) .

相关问题