我刚刚使用tornado.web.authenticated添加了一个基于在线教程的简单登录。不幸的是,在成功注销后,当我按下浏览器上的后退按钮时,我仍然可以看到已登录的页面。有没有办法触发浏览历史记录中页面的登录屏幕?
编辑:为了澄清,我已经在使用@ tornado.web.authenticated注释,它在正常使用情况下运行良好,但我遇到的问题是,当使用浏览器的Back按钮返回时,我是仍然可以看到页面就好像我已经登录。我希望有办法解决这个潜在的安全问题。
答案 0 :(得分: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
然后使用@protected而不是@ tornado.web.authenticated装饰受保护的页面。
答案 1 :(得分:2)
在您的方法上使用authenticated装饰器,这将确保并将用户重定向到登录页面。
login_url应该配置部分设置 -
settings = dict({
"login_url": "/#login",
.....
})
和decorator应该像 -
一样添加class Home(BaseHandler):
@tornado.web.authenticated
...
编辑 - 用户应该注销,您可以按F5进行检查,它会将您重定向到登录页面。如果它向您显示内容只是一个缓存问题,您可能必须明确清除缓存。