web2py 检查表单中的密码
web2py check password in form
我正在尝试在 web2py 中创建一个更改密码表单。我正在使用 db.auth_user table。我想创建一个包含字段 ['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
知道如何实现密码验证吗?
web2py 身份验证系统包含一个内置的密码更改操作。如果您在 default.py
控制器中使用默认的 user
操作,您可以通过 /myapp/default/user/change_password.
访问此表单
如果您更愿意为此目的创建一个单独的控制器操作,您可以简单地执行以下操作:
def change_password():
return dict(form=auth.change_password())
并在相关视图中:
{{=form}}
关于您的自定义代码,您不能单独使用 IS_EQUAL_TO
验证器,因为它采用的表达式必须等于随表单提交的值(您不能使用转换后的值调用验证器,因为您有,因为那将 return 一个元组,但是 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
验证器可以接受一个将传递值的函数,该函数应该 return True
或 False
(注意,这种用法不是已记录——本书仅显示替代用法,其中您提供 Python 代码作为字符串,这将是 exec'ed
).
我正在尝试在 web2py 中创建一个更改密码表单。我正在使用 db.auth_user table。我想创建一个包含字段 ['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
知道如何实现密码验证吗?
web2py 身份验证系统包含一个内置的密码更改操作。如果您在 default.py
控制器中使用默认的 user
操作,您可以通过 /myapp/default/user/change_password.
如果您更愿意为此目的创建一个单独的控制器操作,您可以简单地执行以下操作:
def change_password():
return dict(form=auth.change_password())
并在相关视图中:
{{=form}}
关于您的自定义代码,您不能单独使用 IS_EQUAL_TO
验证器,因为它采用的表达式必须等于随表单提交的值(您不能使用转换后的值调用验证器,因为您有,因为那将 return 一个元组,但是 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
验证器可以接受一个将传递值的函数,该函数应该 return True
或 False
(注意,这种用法不是已记录——本书仅显示替代用法,其中您提供 Python 代码作为字符串,这将是 exec'ed
).