2013-08-12 17 views
7

Używam login i dyrektor Flask do zarządzania tożsamością i rolą. Moje potrzeby są opisane wprost z dokumentów. Mój kod jest tutaj:Logowanie i główne logowanie w kolbie - użytkownik current_user jest anonimowy, mimo że jestem zalogowany

@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)) 

W moim kodu logowania to zrobić:

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

Po zalogowaniu ognie sygnałowe, jak oczekiwano. Przy każdym kolejnym ładowaniu strony użytkownik current_user jest anonimowy i nie ma identyfikatora użytkownika, ale wszystkie funkcje @login_required zachowują się tak, jakby użytkownik był zalogowany. Logowanie przy użyciu Flask wie, że użytkownik jest zalogowany, ale z jakiegoś powodu użytkownik current_user jest niespójny.

Czy brakuje mi gdzieś istotnego punktu konfiguracji?

+0

Czy robisz cokolwiek z 'static_url_path = ''' w twoim instrumencie Flask? Wystąpił podobny problem, patrz: http://stackoverflow.com/questions/16627384/flask-login-with-static-user-always-riielding-401-nauthorized Było kłopotliwe, ponieważ sesja i logowanie wyglądały dobrze (użytkownik mógł się zalogować), ale zawsze miałem anonimowego użytkownika podczas uderzania w zabezpieczony punkt końcowy – craigb

Odpowiedz

5

Napotkałem ten sam problem! Główną przyczyną jest to, że zarówno Flask-Login jak i Flask-Principal są wywoływane przez Flask podczas etapu "preprocess" żądania w kolejności, w jakiej zostały zarejestrowane w twojej aplikacji Flask. Jeśli zarejestrujesz Flask-Principal przed zarejestrowaniem Flask-Login, to @identity_loaded.connect_via(app) zostanie wywołane przed @login_manager.user_loader, a zatem current_user zwróci anonimowego użytkownika.

Przykład dokumentacji dokumentacji Flask-Principal pokazuje a code excerpt, gdzie Flask-Principal jest zarejestrowany przed Flask-Login. TSK TSK! Oto, co skończyło się robi w moim bootstrap:

login_manager = LoginManager() 
login_manager.init_app(app) 

# ... 

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

Wtedy w moim users.py pliku Widok:

@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. 

To rozwiązało problem dla mnie.

Edytuj: Przedłożyłem a bug report do projektu dokumentacji.