2016-09-12 16 views
4

フラスコセキュリティを使用してユーザーを認証しています。私は認証がhttp_auth_requiredデコレータで正しく動作することを確認しました - ユーザーはユーザーストア(私の場合はSQLAlchemyUserDatastore)に対して検証されており、すべて正常です。Flask-Securityのカスタム認証方法

Flask-Securityが私に与えるもの(current_userなど)を利用しながら、独自の認証方法(私はカスタムLDAP検証システムを使用します)を使用したいと考えています。私はそれは私が自分で行うことができないいくつかのものをやっている_check_http_authと呼ばれるプライベート関数を使用していることがわかりhttp_auth_requiredデコレータを見ると、しかし

def authenticate_with_ldap(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
     if not request.authorization: 
      return unauthorized_user_handler() 
     user = user_datastore.get_user(request.authorization.username) 
     if not user or not authenticate_with_ldap(user.email, user.password): 
      return unauthorized_user_handler() 
     return func(*args, **kwargs) 
    return wrapper 

:私はこのようになりますカスタムデコレータを書きましたリクエスト・コンテキスト・スタックの先頭にユーザを設定し、シグナルを送信するなど、プライベート・メンバにアクセスする必要はありません。コードは次のようになります。

def _check_http_auth(): 
    auth = request.authorization or BasicAuth(username=None, password=None) 
    user = _security.datastore.find_user(email=auth.username) 

    if user and utils.verify_and_update_password(auth.password, user): 
     _security.datastore.commit() 
     app = current_app._get_current_object() 
     _request_ctx_stack.top.user = user 
     identity_changed.send(app, identity=Identity(user.id)) 
     return True 

    return False 

だから私の質問です:まだ最大限にフラスコ・セキュリティを利用しながら、カスタム認証方法を持ってする正しい方法は、何ですか?

答えて

1

これはクイックサルのパッチで実現できます。理想的ではありませんが、Flask-Securityチームがこれを処理するよりエレガントな方法で書くまで、他に何ができるのか分かりません。

import flask_security 

def verify_and_update_password_custom(password, user): 
    return user.verify_password(password)  

flask_security.forms.verify_and_update_password = verify_and_update_password_custom 

他の場所で使用されているかわかりません。上記は私自身の目的のために働く。他の場所で呼び出された場合は、それがどこにでもある場所にそれをmonkeypatchする必要があります。