2016-09-12 6 views
4

Я использую защиту флагов для аутентификации пользователей. Я убедился, что аутентификация работает правильно с декоратором 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 на полную катушку?

ответ

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 

Я не уверен, что он используется где-либо еще. Вышеизложенное работает для моих целей. Если это вызвано в другом месте, вам просто нужно будет обезопасить его на месте, где бы это ни было.

 Смежные вопросы

  • Нет связанных вопросов^_^