2016-09-12 5 views
4

Ich verwende Flaschensicherheit, um Benutzer zu authentifizieren. Ich habe sichergestellt, dass die Authentifizierung ordnungsgemäß mit dem http_auth_required Decorator funktioniert - der Benutzer wird gegen den Benutzer getestet (eine SQLAlchemyUserDatastore in meinem Fall), und alles ist gut.Benutzerdefinierte Authentifizierungsmethode für Flask-Security

Ich möchte jetzt meine eigene Authentifizierungsmethode verwenden (ich benutze ein benutzerdefiniertes LDAP-Validierungssystem), während ich immer noch die Vorteile von Flask-Security ausnutze (Dinge wie current_user). Ich schrieb eine benutzerdefinierte Dekorateur, der wie folgt aussieht:

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 

Allerdings, wenn ich an dem http_auth_required Dekorateur sehe ich sehe, dass es eine private Funktion verwendet _check_http_auth genannt, die einige Dinge tut, die ich nicht auf meinem eigenen tun ohne auf private Mitglieder zuzugreifen, wie den Benutzer an den Anfang des Anforderungskontextstapels zu setzen und Signale zu senden. Der Code sieht wie folgt aus:

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 

Also meine Frage ist: Was ist der richtige Weg ist, eine benutzerdefinierte Authentifizierungsmethode zu haben, während noch Flask-Sicherheit nutzen zu seinem vollsten?

Antwort

1

Sie können dies mit einem schnellen Affen-Patch erreichen. Nicht ideal, aber ich bin nicht sicher, was Sie sonst noch tun können, bis das Flask-Security-Team auf eine elegantere Weise schreibt, um damit umzugehen.

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 

Ich bin mir nicht sicher, ob es irgendwo anders verwendet wird. Das oben genannte funktioniert für meine eigenen Zwecke. Wenn es anderswo aufgerufen wird, müssen Sie es einfach an Ort und Stelle, wo auch immer das ist.

Verwandte Themen