5

我使用 Flask-Login 和 Flask-Principal 开发 Flask 应用程序,到目前为止一切正常,除了 Flask-Login 的记住我功能。

实际上,记住我功能在 Flask-Login 端有效,但 Flask-Principal 的 identity_loaded 功能不会被触发。

当我记录@login_manager.user_loader 和@identity_loaded.connect 的调用时,我登录时看到两者都被调用,但是当我关闭浏览器并重新启动它时,只会调用@login_manager.user_loader。所以我的用户基本上已经登录但没有角色。

Flask-Login 在 GitHub 上有一个已关闭的问题 #19,但它实际上并没有回答我的问题:-/

有没有人知道当用户从 cookie 中加载时如何反应?

4

1 回答 1

4

在 before_request 上,flask-principal一次运行一个 identity_loaders,直到找到任何身份。如果它没有找到任何身份,identity_loaded将不会被调用。

默认情况下,第一个 identity_loader 始终是会话加载器。

当您重新启动浏览器时,会话将消失,因此flask-principal无法加载任何身份,因此identity_loaded不会调用您的回调。但是您仍然处于登录状态,因为flask-login' cookie 'remember_token' 将在 31 天后过期。

因此,要摆脱这种特质,您可以添加 new identity_loader,它只会在会话到期时运行。

principal = Principal(app)

@principal.identity_loader
def load_identity_when_session_expires():
    if hasattr(current_user, 'id'):
        return Identity(current_user.id)
于 2014-07-28T19:01:05.043 回答