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?