【发布时间】:2016-04-20 14:12:43
【问题描述】:
一个主页,匿名用户可以登录。
登录后,他们可以访问受保护的内容(为匿名用户返回 401)。
但是,当用户执行以下步骤时:
- 登录
- 访问受保护的页面
- 注销
- 返回受保护的页面(通过点击返回按钮或输入地址)
现在匿名的用户仍然可以看到受保护页面的内容,以及他之前登录的用户的数据。
有趣的是,这种行为仅发生在生产环境中(不在我的本地开发机器上)。在dev 中,一切正常,一旦用户注销,他将无法再访问受保护的内容。这让我猜测这本身不是应用程序问题,而是nginx 或gunicorn 的级别。
有什么想法吗?
/application.py
from flask.ext.login import logout_user, login_required
# ...
@app.route('/logout')
def logout():
if not current_user.is_anonymous:
logout_user()
return redirect(url_for('index'))
@app.route('/me')
@login_required
def me():
return render_template('me.html')
/templates/me.html
{{ current_user.name }}
<a href="{{ url_for('logout') }}">Logout</a>
【问题讨论】:
-
您如何检查他们是否已登录?曲奇饼? /访问令牌?后退按钮可能会/可能不会发出新请求,以便他们可以获取内容的本地副本,当他们这样做时,您是否在应用中看到新请求?
-
我正在使用
flask-login,它使用会话和 cookie 数据。它应该在注销时删除其所有 cookie 和会话数据,他在dev中做得很好,但在prod中似乎没有这样做。 -
在
prod中注销后,如果您使用 devtools/etc.. 并查看您的 cookie,您是否仍然看到 cookie? dev/prod 之间是否有任何区别(即在 prod 中使用 SSL,而不是在 dev 中) -
实际上
prod的问题似乎比这更大:当用户登录时,他被重定向到主页......显示为匿名用户。只有当他点击“刷新”时,他才会看到“已登录”的主页。 -
简单地说,在
prod中,用户需要“刷新”才能考虑登录/注销操作。以前从未注意到这种行为。
标签: python nginx flask gunicorn flask-login