(2018-05-29.Python從Zero到One)8、(Tornado)安全應(yīng)用__1.6.3用戶驗證

6.3 用戶驗證

用戶驗證是指在收到用戶請求后進(jìn)行處理前先判斷用戶的認(rèn)證狀態(tài)(如登陸狀態(tài)),若通過驗證則正常處理,否則強(qiáng)制用戶跳轉(zhuǎn)至認(rèn)證頁面(如登陸頁面)。

authenticated裝飾器

為了使用Tornado的認(rèn)證功能,我們需要對登錄用戶標(biāo)記具體的處理函數(shù)。我們可以使用@tornado.web.authenticated裝飾器完成它。當(dāng)我們使用這個裝飾器包裹一個處理方法時,Tornado將確保這個方法的主體只有在合法的用戶被發(fā)現(xiàn)時才會調(diào)用。

class ProfileHandler(RequestHandler):
    @tornado.web.authenticated
    def get(self):
        self.write("這是我的個人主頁。")

get_current_user()方法

裝飾器@tornado.web.authenticated的判斷執(zhí)行依賴于請求處理類中的self.current_user屬性,如果current_user值為假(None、False、0、""等),任何GET或HEAD請求都將把訪客重定向到應(yīng)用設(shè)置中l(wèi)ogin_url指定的URL,而非法用戶的POST請求將返回一個帶有403(Forbidden)狀態(tài)的HTTP響應(yīng)。

在獲取self.current_user屬性的時候,tornado會調(diào)用get_current_user()方法來返回current_user的值。也就是說,我們驗證用戶的邏輯應(yīng)寫在get_current_user()方法中,若該方法返回非假值則驗證通過,否則驗證失敗。

class ProfileHandler(RequestHandler):
    def get_current_user(self):
        """在此完成用戶的認(rèn)證邏輯"""
        user_name = self.get_argument("name", None)
        return user_name 

    @tornado.web.authenticated
    def get(self):
        self.write("這是我的個人主頁。")

login_url設(shè)置

當(dāng)用戶驗證失敗時,將用戶重定向到login_url上,所以我們還需要在Application中配置login_url。

class LoginHandler(RequestHandler):
    def get(self):
        """在此返回登陸頁面"""
        self.write("登陸頁面")

app = tornado.web.Application(
    [
        (r"/", IndexHandler),
        (r"/profile", ProfileHandler),
        (r"/login", LoginHandler),
    ],
    "login_url":"/login"
)

想一想,完成登陸操作后應(yīng)該進(jìn)入哪個頁面?

day61_tornado-安全應(yīng)用-01.png

在login_url后面補充的next參數(shù)就是記錄的跳轉(zhuǎn)至登錄頁面前的所在位置,所以我們可以使用next參數(shù)來完成登陸后的跳轉(zhuǎn)。

修改登陸邏輯:

class LoginHandler(RequestHandler):
    def get(self):
        """登陸處理,完成登陸后跳轉(zhuǎn)回前一頁面"""
        next = self.get_argument("next", "/")
        self.redirect(next+"?name=logined")

用戶訪問的網(wǎng)址順序:

day61_tornado-安全應(yīng)用-02.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容