【问题标题】:User can see protected pages after logging out用户退出后可以看到受保护的页面
【发布时间】:2016-04-20 14:12:43
【问题描述】:

一个主页,匿名用户可以登录。

登录后,他们可以访问受保护的内容(为匿名用户返回 401)。

但是,当用户执行以下步骤时:

  1. 登录
  2. 访问受保护的页面
  3. 注销
  4. 返回受保护的页面(通过点击返回按钮或输入地址)

现在匿名的用户仍然可以看到受保护页面的内容,以及他之前登录的用户的数据。

有趣的是,这种行为发生在生产环境中(不在我的本地开发机器上)。在dev 中,一切正常,一旦用户注销,他将无法再访问受保护的内容。这让我猜测这本身不是应用程序问题,而是nginxgunicorn 的级别。

有什么想法吗?


/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


【解决方案1】:

这应该做的工作,在登录期间创建一个会话cookie和一个响应对象,并根据会话cookie的存在来识别用户,但当用户注销时删除会话cookie。 进一步这可能会有所帮助☺☺☺

https://pythonhosted.org/Flask-Session/

【讨论】:

    【解决方案2】:

    正如我发布的另一个问题中所解释的,与同一主题相关:

    nginx does not receive requests except for hard refresh

    问题在于nginx 缓存设置。

    http { ... } 中添加expires 0;nginx.conf 就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 2014-11-22
      • 2018-12-31
      • 2012-04-15
      • 2010-09-17
      相关资源
      最近更新 更多