Я использую защиту флагов для аутентификации пользователей. Я убедился, что аутентификация работает правильно с декоратором http_auth_required
- пользователь проверяется против пользовательского магазина (SQLAlchemyUserDatastore
в моем случае), и все хорошо.Пользовательский метод проверки подлинности для Flask-Security
Я бы хотел использовать мой собственный метод проверки подлинности (я буду использовать настраиваемую систему проверки LDAP), но все еще использую вещи, которые предоставляет мне Flask-Security (например, current_user
). Я написал пользовательский декоратор, который выглядит следующим образом:
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
Однако, когда я смотрю на http_auth_required
декоратора я вижу, что он использует частные функции под названием _check_http_auth
, который делают некоторые вещи, которые я не могу сделать в одиночку без доступа к частным членам, например, установка пользователя в верхнюю часть стека контекста запроса и отправку сигналов. Код выглядит следующим образом:
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
Так что мой вопрос: что такое правильный способ иметь метод пользовательской аутентификации, при этом используя Flask-Security на полную катушку?