zoukankan      html  css  js  c++  java
  • Tornado web.authenticated 用户认证浅析

    在Web服务中会有用户登录后的一系列操作, 如果一个客户端的http
    请求要求是用户登录后才能做得操作, 那么 Web服务器接收请求时
    需要判断该请求里带的数据是否有用户认证的信息.

    使用 Tornado 框架开发Web服务, 框架里提供了tornado.web.authenticated
    的 decorator 的辅助开发者做用户登录认证, 即开发者在实现一个 handler
    (对应一个url资源, 继承于tornado.web.RequestHandler)时,
    该 url的资源操作需要有用户认证或者登录为前提, 那么在资源请求的方法
    覆写时(overwritten), 例如在 get 与 post 方法定义前以
    tornado.web.authenticated 装饰,并且同时覆写 get_current_user
    方法(RequestHandler只是定义空函数, 默认放回None). 在覆写之后,
    RequestHandler 类的实例里 current_user 就会有值. current_user
    在 tornado源码中是 getter setter的实现, 真正的成员变量是 _current_user
    (稍后解析tornado里的源码). authenticated 即实现了 current_user 判断
    这一过程来验证用户.

    先来看简单的例子(已添加注释 代码来自中文文档):

    不使用 tornado.web.authenticated, 直接判断 current_user 成员

    在 Get 方法上添加 authenticated 装饰器实现用户认证:

    看完实现的小例子, 就要探究其 decorator 的实现细节:
    以知晓 tornado 为何可以辅助开发者更方便实现用户认证
    源码版本 tornado 4.0.2 tornado/web.py (已添加注释):

    这里我们要理解的是 authenticated 装饰器的用法, 继承于
    RequestHandler 的 handler 类, 开发者覆写 get post 方法
    实现时, 如果要判断请求的合理性(即用户是否被认证过), 可
    以在覆写方法里业务代码前加上判断代码, 这样也可以实现
    同样的功能, 而 Tornado 利用了Python的语言特性, 将用户
    认证的代码通过 decorator “桥接” 完成, 即 get post 这些 http
    请求方法里的代码可以保持功能的专注度. 此外, 如果开发
    需求更改, 资源请求不需要用户认证时, 可直接注释或者删除
    方法上方的 decorator 即可, 方便快捷省事:).

    用户认证未通过的重定向设置

    当用户没有认证通过时, 可以在程序入口, 设置 settings dict 属性,
    设置 login_url 属性 参考文档
    “””
    login_url: The authenticated decorator will redirect to this url
    if the user is not logged in. Can be further customized
    by overriding RequestHandler.get_login_url
    “””
    样例:


    用户认证在什么场景下使用:

    我们通常的业务需求中, 会涉及到 session会话保持 与 cookie 的
    用户数据的读取场景, 即从 http 请求的 cookie 中读取 sessionid,
    以 sessionid 为 key, 从内存或者缓存中判断 sessionid 是否存在值,
    以此作为用户登录状态的认证, 或者是用户重新打开浏览器, 之前
    浏览器缓存的cookie里的sessionid重新发送给客户端, 用户无需
    重新输入账号密码, 即可直接在登录状态. 较前两年基于 memcache
    做服务端 session 的缓存, 现在可以使用 Redis 服务替代 memcache,
    做缓存数据库的工作.

  • 相关阅读:
    [NOIP2003]加分二叉树
    POJ3737 UmBasketella
    [POI2008]STA-Station
    [SDOI2014]旅行
    说明位图,矢量图,像素,分辨率,PPI,DPI?
    像素 PIXEL 图片的基本单位 像素非常小 图片是成千上万的像素组成 显示/屏幕分辨率 (DPI 屏幕分辨率)
    使用 parted 命令可以查看系统采用什么类型的分区表 gpt/mbr/msdos/ext/ext/ext2/ext3/ext4
    Linux硬件与服务
    Linux是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的性能稳定的操作系统,可免费使用并自由传播。
    cut命令用于按“列”提取文本字符,格式为“cut [参数] 文本”
  • 原文地址:https://www.cnblogs.com/apexchu/p/4239844.html
Copyright © 2011-2022 走看看