【问题标题】:tornado.web.authenticated back button issuetornado.web.authenticated 返回按钮问题
【发布时间】:2014-02-10 15:15:28
【问题描述】:

我刚刚根据一些在线教程使用 tornado.web.authenticated 添加了一个简单的登录。不幸的是,在成功注销后,当我按下浏览器上的返回按钮时,我仍然能够看到已登录的页面。有没有办法触发浏览历史中页面的登录屏幕?

编辑:澄清一下,我已经在使用 @tornado.web.authenticated 注释,它在正常用例中运行良好,但我遇到了一个问题,当使用浏览器的后退按钮返回时,我是仍然能够像登录一样查看页面。我希望有办法解决这个潜在的安全问题。

【问题讨论】:

    标签: python authentication tornado


    【解决方案1】:

    当您在注销后点击返回按钮时,您的浏览器会从缓存中加载上一页。为防止受保护的页面被缓存,您必须按照this question中所述设置以下标头

    self.set_header('Cache-Control', 'no-cache, no-store, must-revalidate')
    self.set_header('Pragma', 'no-cache')
    self.set_header('Expires', '0')
    

    你可以把它放在一个装饰器中,比如:

    def protected(method):
        @tornado.web.authenticated
        @functools.wraps(method)
        def wrapper(self, *args, **kwargs):
            self.set_header('Cache-Control', 'no-cache, no-store, must-revalidate')
            self.set_header('Pragma', 'no-cache')
            self.set_header('Expires', '0')
            return method(self, *args, **kwargs)
        return wrapper
    

    然后使用@protected 而不是@tornado.web.authenticated 来装饰您的受保护页面。

    【讨论】:

    • 整洁!在被@Mutant 指出后,我自己找到了缓存控制。不过,您的回答似乎比我打算做的要干净得多。
    【解决方案2】:

    在您的方法中使用 authenticated 装饰器,这将确保并将用户重定向到登录页面。

    login_url 应该是设置的一部分——

    settings = dict({
        "login_url": "/#login",
        .....
     })
    

    装饰器应该像 -

    class Home(BaseHandler):
        @tornado.web.authenticated
        ...
    

    编辑 - 用户应该被注销,您可以按 F5 进行检查,它会将您重定向到登录页面。如果它向您显示内容,则它只是一个缓存问题,您可能需要明确清除缓存。

    【讨论】:

    • 是的,抱歉,我最初的问题并不清楚,但我已经在使用该注释。在正常情况下,它工作正常,但我的问题是当我按下浏览器上的后退按钮时它不会重定向到 login_url。这可能是不安全的。我将尝试更新我的问题以进行澄清。
    • @magicpanda - 在这种情况下,它似乎是浏览器缓存历史记录问题。您可能想明确删除它。看看这里的一些讨论 - groups.google.com/forum/#!topic/python-tornado/cfTvHzGCrcQ
    • 是的,你一针见血。谢谢。 +1
    猜你喜欢
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多