2013-08-12 8 views
7

Я использую флажок Login и Principal для управления идентификацией и ролями. Мои потребности описаны прямо из документов. Мой код здесь:Flask Login и Principal - current_user анонимный, хотя я вошел в систему

@identity_loaded.connect_via(app) 
def on_identity_loaded(sender, identity): 
    # Set the identity user object 
    identity.user = current_user 

    # Add the UserNeed to the identity 
    if hasattr(current_user, 'get_id'): 
     print 'current_user ' + str(current_user.get_id()) 
     identity.provides.add(UserNeed(current_user.get_id)) 

    # Assuming the User model has a list of roles, update the 
    # identity with the roles that the user provides 
    if hasattr(current_user, 'roles'): 
     if current_user.roles: 
      for role in current_user.roles: 
       identity.provides.add(RoleNeed(role.name)) 

В моем коде авторизации я делаю это:

identity_changed.send(current_app._get_current_object(), 
            identity=Identity(user.user_id) 

На входе, сигнал срабатывает, как и ожидалось. При каждой последующей загрузке страницы current_user является анонимным и не имеет идентификатора пользователя, но все функции @login_required ведут себя так, как если бы пользователь вошел в систему. Вход в флэшку знает, что пользователь вошел в систему, но по какой-то причине current_user несовместим.

Я пропустил какой-то важный пункт конфигурации где-нибудь?

+0

Вы делаете что-нибудь с 'static_url_path = ''' в своем инициализации Flask? Я столкнулся с подобной проблемой: http://stackoverflow.com/questions/16627384/flask-login-with-static-user-always-yielding-401-unauthorized. Это было недоумение, поскольку сеанс и логин выглядели хорошо (пользователь может войти в систему), но у меня всегда был анонимный пользователь, когда вы попали в защищенную конечную точку – craigb

ответ

5

Я столкнулся с той же проблемой! Основная причина заключается в том, что флак-логин и флажок-главный вызываются Flask во время этапа «preprocess» запроса в том порядке, в котором они были зарегистрированы в вашем приложении Flask. Если вы зарегистрируете Flask-Principal перед регистрацией Flask-Login, то @identity_loaded.connect_via(app) будет вызываться до @login_manager.user_loader, и поэтому current_user вернет анонимного пользователя.

В примере с иллюстрацией флакона-основного документа a code excerpt, где зарегистрирован флагманский флакон до Flask-Login. Tsk tsk! Вот то, что я в конечном итоге делает в моей начальной загрузки:

login_manager = LoginManager() 
login_manager.init_app(app) 

# ... 

principals = Principal(app) # This must be initialized after login_manager. 

Тогда в моем users.py просмотра файла:

@identity_loaded.connect_via(app) 
def on_identity_loaded(sender, identity): 
    """ This function is called by Flask-Principal after a user logs in. """ 

    identity.user = current_user 

    if isinstance(current_user, User): 
     identity.provides.add(UserNeed(current_user.id)) 

    for permission in user.permissions: 
     # Do permission-y stuff here. 

Это решило проблему для меня.

Редактировать: Я отправил a bug report в проект документации.