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,
做緩存數據庫的工作.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM