2013-08-12 33 views
7

Tôi đang sử dụng Đăng nhập Flask và Hiệu trưởng để quản lý danh tính và vai trò. Nhu cầu của tôi được mô tả trực tiếp từ các tài liệu. Mã của tôi là ở đây:Đăng nhập và Nguyên tắc Flask - current_user là Ẩn danh mặc dù tôi đã đăng nhập

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

Trong mã đăng nhập của tôi, tôi làm điều này:

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

On đăng nhập, pháo hiệu như mong đợi. Trên mỗi lần tải trang tiếp theo, current_user là ẩn danh và không có id người dùng nào được nêu ra tất cả các chức năng @login_required hoạt động như thể người dùng đã đăng nhập. Đăng nhập Flask biết rằng người dùng đã đăng nhập nhưng vì lý do nào đó current_user không nhất quán.

Tôi có thiếu điểm cấu hình thiết yếu ở đâu đó không?

+0

bạn có đang làm bất cứ điều gì với 'static_url_path = ''' trong init Flask của bạn không? Tôi đã chạy vào vấn đề tương tự, xem: http://stackoverflow.com/questions/16627384/flask-login-with-static-user-always-yielding-401-unauthorized Đó là bối rối như các phiên và đăng nhập công cụ nhìn ổn (người dùng có thể đăng nhập) nhưng tôi luôn có người dùng ẩn danh khi nhấn điểm cuối được bảo mật – craigb

Trả lời

5

Tôi đã gặp phải vấn đề tương tự! Nguyên nhân gốc là cả Flask-Login và Flask-Principal được gọi bởi Flask trong giai đoạn "preprocess" của yêu cầu theo thứ tự mà chúng đã được đăng ký với ứng dụng Flask của bạn. Nếu bạn đăng ký Flask-Principal trước khi bạn đăng ký Flask-Login, thì @identity_loaded.connect_via(app) sẽ được gọi trước @login_manager.user_loader và do đó current_user sẽ trả về người dùng ẩn danh.

Ví dụ về tài liệu chính của Flask hiển thị a code excerpt nơi Hiệu trưởng Flask được đăng ký trước Flask-Login. TSK tsk! Đây là những gì tôi đã kết thúc làm trong bootstrap của tôi:

login_manager = LoginManager() 
login_manager.init_app(app) 

# ... 

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

Sau đó, trong tập tin xem users.py tôi:

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

này đã giải quyết được vấn đề đối với tôi.

Chỉnh sửa: Tôi đã gửi a bug report cho dự án cho tài liệu.

Các vấn đề liên quan