3

私は現在、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 回限りのパスワード コードが作成されます。

私が見た便利なもの:

  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'))
    
  2. 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 をオーバーライドしてフィールドを少なくし、同じ機能を持たせる方法が見つからないため、具体的にオーバーライドするものがないため、そのようなコードをどこに追加するかさえわかりません。

私のコードの構造は、フラスコセキュリティのドキュメントのクイックスタートに沿っています。

事前にご案内いたしますので、よろしくお願いいたします。

4

4 に答える 4

1

登録プロセスは、次のようにアクセスできるウィンカー付きの信号を作成します。

from flask.ext.security.signals import user_registered
@user_registered.connect_via(app)
def user_registered_sighandler(app, user, confirm_token):
    user_datastore.deactivate_user(user)
    db.session.commit()

これにより、新しく登録されたユーザーが非アクティブ化されます。

于 2016-02-20T07:47:26.007 に答える
1

また、flask-security も参照してください - 管理者はユーザーを作成し、ユーザーにパスワードの選択を強制します

これは、flask-security-too を調べた後に見つけた別の解決策です。管理者にユーザー フォームを作成させ、データベースにユーザーを作成した後に次のコードを追加するだけです。

from flask_security.recoverable import send_reset_password_instructions

# my code is maintains self.created_id after creating the user record
# this is due to some complex class involved which handles my crudapi stuff
# your code may vary
user = User.query.filter_by(id=self.created_id).one()
send_reset_password_instructions(user)
于 2020-01-04T18:18:43.303 に答える