web2py检查表单中的密码

时间:2016-08-06 22:33:35

标签: passwords web2py

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

如果密码输入不正确,表格应该向用户发出警告。

我的代码是:

import requests

url = "saytts"    
data = {"text": "text"}
result = requests.get(url, data)
print(result.status_code)
print(result.text)

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

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')))

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

1 个答案:

答案 0 :(得分:1)

web2py Auth系统包含内置密码更改操作。如果您使用user控制器中的默认default.py操作,则可以通过/ 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)。