2014-02-10 124 views
2

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

编辑:为了澄清,我已经使用@ tornado.web.authenticated批注,它正常运行正常的使用情况,但我遇到了问题,当返回使用浏览器的后退按钮时,我我仍然能够看到网页,就好像我登录了一样。我希望有一种方法可以解决这个潜在的安全问题。

回答

5

当您在注销后点击后退按钮时,浏览器会从缓存中加载前一页。为了防止受保护的页面被缓存,您必须设置以下标题为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 

然后用@装饰你的受保护的网页保护而不是@ tornado.web.authenticated。

+0

整洁!在被@Mutant指向后,我发现了自己的缓存控制。不过,你的答案似乎比我要做的要干净得多。 – magicpanda

2

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

LOGIN_URL应配置的部分设置 -

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

编辑 - -

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

和装饰应该像添加用户应注销,您可以按F5查看,并它会将您重定向到登录页面。如果它显示你的内容只是一个缓存问题,你可能不得不明确清除缓存。

+1

是的,抱歉,我原来的问题并不清楚,但我已经在使用该注释。在正常情况下,它工作正常,但我的问题是,当我按下浏览器上的后退按钮时,它不会重定向到login_url。这可能是不安全的。我会尝试更新我的问题以进行澄清。 – magicpanda

+2

@magicpanda - 在这种情况下,它似乎是浏览器缓存历史记录问题。你可能想要明确地删除它。看看这里的一些讨论 - https://groups.google.com/forum/#!topic/python-tornado/cfTvHzGCrcQ – Mutant

+0

是的,你击中了头部。谢谢。 +1 – magicpanda