Tornado使用Cookie-based seesion来管理user auth,参考文档需要注意以下事项:
1. RequestHandler self.current_user 默认情况是None。
2. 实现用户权限管理,我们需要在你的request handler重写get_current_user()来判断(获得)当前合法用户。
由于Cookie是浏览器选项,用户可以选择禁用Cookie,那该如何判断用户浏览器是否禁用Cookie?
我的思路是在用户第一次request GET的时候,在对应的response中设置一个任意的Cookie值,“checkflag”,这样在接下来的第二次request GET/POST的HTTP Header将包含“Cookie”的信息,禁用Cookied的浏览器在HTTP Headers是不会有“Cookie”信息
我这里根据tornado user authentication 示例代码稍作修改,当用户浏览器禁用Cookie的时候给予一定的提示信息:
import tornado.httpserver
import tornado.ioloop
import tornado.web
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
return self.get_secure_cookie("user")
class MainHandler(BaseHandler):
def get(self):
if not self.current_user:
self.redirect("/login")
return
name = tornado.escape.xhtml_escape(self.current_user)
self.write("Hello, " + name)
class LoginHandler(BaseHandler):
def get(self):
self.set_cookie("checkflag", "true")
self.render("templates/logintest/login.html")
def post(self):
if not self.request.headers.get("Cookie"):
self.render("templates/logintest/require_enable_cookie.html")
return
self.set_secure_cookie("user", self.get_argument("name"))
self.redirect("/")
application = tornado.web.Application([
(r"/", MainHandler),
(r"/login", LoginHandler),
], cookie_secret="hello")
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8081)
tornado.ioloop.IOLoop.instance().start()
<html>
<body>
<form action="/login" method="post">
name: <input type="text" name="name"/>
<input type="submit" value="Sign in"/>
</form>
</body>
</html>
Please enable your Cookie option of your browser.
说明:
当首次访问"/"的时候,要求进行用户登录,这里用一个输入框来模拟用户登录,在重定向的"/login" GET对应的response中,提供一个任意“checkflag”cookie值,这样如果用户enable cookie,在下次的http GET/POST请求headers中将会带有“Cookie”信息,否则提供相关的页面信息。
一些Cookie-based session知识:
Cookie-based session 数据是存储在客户端,集群和故障转移是不需要的,在需要的情况下你可以重启servers而不必担心session数据的丢失
Cookie-based session 用户可以访问不同的servers,而不需要被绑定在某一个数据环境(每次的http请求都要求constant querying)
Cookie-based session 只会消耗少量的CPU周期用于校验,任何集中session存储势必会带来一定的瓶颈,即使你保持session data在内存中,这样只会将这些数据绑定在单一的机器上。
Cookie-based session 适用保存一些少量、关键数据,同时需要考虑cookie的一些限制,例如浏览器禁用cookie。
我有试过Gmail,126.com (一些SSL站点)都是需要enable cookie
如果有理解不正确的地方,请大家帮忙予以指正,
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com