私は現在、Flask-Security (Flask-WTForms、Flask-SQLalchemy、および Flask-Login を含む) を使用して webapp のログインを構築しています。パスワードを忘れた場合も含め、ほとんどのログイン フローを簡単に設定できました。ただし、ユーザーを登録できる唯一の方法は、管理者のみがアクセスできるページを介して行うようにしたいと考えています。役割 (管理者、ユーザー) を構成し、次のビューを設定することができました。
@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
これら 2 つを何らかの形で組み合わせて、「/adminregister」で唯一のフィールド「Email」を含むフォームを送信すると、データベースに安全なランダム パスワードがメールに追加され、メール アドレスにパスワードを変更するためのリンク (理想的には、説明するメッセージ)。特に RegisterForm をオーバーライドしてフィールドを少なくし、同じ機能を持たせる方法が見つからないため、具体的にオーバーライドするものがないため、そのようなコードをどこに追加するかさえわかりません。
私のコードの構造は、フラスコセキュリティのドキュメントのクイックスタートに沿っています。
事前にご案内いたしますので、よろしくお願いいたします。