我目前正在使用 Flask-Security(包括 Flask-WTForms、Flask-SQLalchemy 和 Flask-Login)为 web 应用程序构建登录。我已经能够相当轻松地设置我的大部分登录流程,包括忘记密码;但是我想这样做,以便用户注册的唯一方法是通过只有管理员可以访问的页面。我设法配置了角色(管理员、用户)并设置了以下视图:
@app.route('/adminregister')
@roles_accepted('admin')
def adminregister():
return render_template('*')
这将创建成功限制为具有管理员角色的帐户的门户。但是,我不确定如何在这里进行,因为 Flask-security 没有内置的方法来启用我正在尝试做的事情。
我已经覆盖了 RegisterForm 以通过正则表达式强制执行密码规则:
# fixed register form
class ExtendedRegisterForm(RegisterForm):
password = TextField('Password', [validators.Required(), validators.Regexp(r'(?=.*?[0-9])(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[$-/:-?{-~!"^_`\[\]])')])
基本上我想要一个位于 /adminregister 的表单,当管理员访问该表单时,它允许输入电子邮件地址,此时首先在数据库中使用随机且安全的密码创建用户,然后执行类似的过程发生忘记密码并创建 1 次密码代码以重置密码。
我看过的有用的东西:
在 flask-security/views.py 中有忘记的密码代码:
def forgot_password(): """View function that handles a forgotten password request.""" form_class = _security.forgot_password_form if request.json: form = form_class(MultiDict(request.json)) else: form = form_class() if form.validate_on_submit(): send_reset_password_instructions(form.user) if request.json is None: do_flash(*get_message('PASSWORD_RESET_REQUEST', email=form.user.email)) if request.json: return _render_json(form, include_user=False) return _security.render_template(config_value('FORGOT_PASSWORD_TEMPLATE'), forgot_password_form=form, **_ctx('forgot_password'))在 flask_security/registerable.py 中有 register_user 的代码
def register_user(**kwargs): confirmation_link, token = None, None kwargs['password'] = encrypt_password(kwargs['password']) user = _datastore.create_user(**kwargs) _datastore.commit() if _security.confirmable: confirmation_link, token = generate_confirmation_link(user) do_flash(*get_message('CONFIRM_REGISTRATION', email=user.email)) user_registered.send(app._get_current_object(), user=user, confirm_token=token) if config_value('SEND_REGISTER_EMAIL'): send_mail(config_value('EMAIL_SUBJECT_REGISTER'), user.email, 'welcome', user=user, confirmation_link=confirmation_link) return user
我想以某种方式将这两者结合起来,以便在“/adminregister”中提交具有唯一字段“电子邮件”的表单后,电子邮件会在数据库中添加一个安全的随机密码,并且电子邮件地址会发送一封电子邮件,其中包含链接以更改密码(最好是一条消息解释)。我什至不确定我会在哪里添加这样的代码,因为没有什么可以专门覆盖,特别是因为我找不到覆盖 RegisterForm 以拥有更少的字段和相同的功能的方法。
我的代码结构与 flask-security 文档的quickstart 一致。
提前感谢您提供的任何指导。