使用tornado實現使用者認證

2022-05-23 04:21:08 字數 3844 閱讀 7627

關於使用者的登入狀態,一部分的應用程式是採用session實現的。

http是乙個無狀態協議,使用者的每次請求都是相互獨立的,http本身意識不到使用者是否登入。

很多web框架選擇將session存放在cookies中,本節我們也是這樣實現:

import

tornado.ioloop

import

tornado.web

class

basehandler(tornado.web.requesthandler):

defget_current_user(self):

return self.get_secure_cookie("

user")

class

mainhandler(basehandler):

defget(self):

ifnot

self.current_user:

self.redirect(

"/login")

return

name =tornado.escape.xhtml_escape(self.current_user)

self.write(

"hello,

" +name)

class

loginhandler(tornado.web.requesthandler):

defget(self):

self.render(

"login.html")

defpost(self):

self.set_secure_cookie(

"user

", self.get_argument("

name"))

self.redirect("/

")(r"/

", mainhandler),

(r"/login

", loginhandler)

], cookie_secret="

61oetzkxqagaydkl5gemgejjfuyh7eqnp2xdtp1o/vo=")

if__name__ == '

__main__':

tornado.ioloop.ioloop.instance().start()

這裡的核心便是loginhandler類,他的get方法對於http的get請求,返回乙個表單,對於post方法,則認為是使用者的登入動作。

登入頁面login.html**如下:

<

html

>

<

head

>

<

title

>login

title

>

head

>

<

body

>

<

form

action

="/login"

method

="post"

accept-charset

="utf-8"

>

<

input

type

="text"

name

="name"

value

="your username"

><

br>

<

input

type

="submit"

value

="submit"

>

form

>

body

>

html

>

這裡處理實際登入的邏輯是,在cookies中存入相應的資料。

這樣,我們檢測使用者是否登入,只需檢測cookies即可,這是basehandler的核心邏輯,它重寫了父類的get_current_user方法。

注意mainhandler的邏輯:

如果使用者沒有登入,那麼跳轉到登入頁面。

如果使用者登入,那麼列印出歡迎的語句。

採用裝飾器

這裡的檢查登入的**,我們可以使用閉包寫乙個裝飾器,這樣可以減少**的冗餘:

login_url = "

login.html

"def

require_login():

deftemp(func):

ifnot

self.current_user:

self.redirect(login_url

)

return

return

return temp

這樣我們在mainhandler中只需要採用裝飾器修飾即可:

class

mainhandler(basehandler):

@require_login()

defget(self):

name =tornado.escape.xhtml_escape(self.current_user)

self.write(

"hello,

" + name)

採用框架提供的裝飾器

mainhandler需要檢測使用者是否登入,我們可以採用裝飾器@tornado.web.authenticated來幫助我們完成這一目標,而不需要手工寫出檢測的**。

import

tornado.ioloop

import

tornado.web

class

basehandler(tornado.web.requesthandler):

defget_current_user(self):

return self.get_secure_cookie("

user")

class

mainhandler(basehandler):

@tornado.web.authenticated

defget(self):

name =tornado.escape.xhtml_escape(self.current_user)

self.write(

"hello,

" +name)

class

loginhandler(tornado.web.requesthandler):

defget(self):

self.render(

"login.html")

defpost(self):

self.set_secure_cookie(

"user

", self.get_argument("

name"))

self.redirect("/

")settings =

(r"/

", mainhandler),

(r"/login

", loginhandler)

], **settings)

if__name__ == '

__main__':

tornado.ioloop.ioloop.instance().start()

很顯然,@tornado.web.authenticated這個裝飾器的功能與我們編寫的require_login功能相似。

另外,在自己編寫的裝飾器中,我們將login_url單獨做成了變數,保證可配置性,所以這裡我們也需要配置login_url選項。

shiro實現使用者認證

login public string login string username string password model model catch unknownaccountexceptione catch incorrectcredential ceptione doctype html h...

vue專案實現使用者登入認證

本專案是在node環境下用vue cli3搭建 根目錄下建立server資料夾,用來建立後台api介面 連線資料庫 server db.js module.exports server sql.js var sql book module.exports sql server index.js co...

通過ssh協議實現使用者key認證登入

author jevonwei 主機a 192.168.198,134 主機b 192.168.198,131 主機c 192.168.198,136 主機a秘鑰連線主機c 4.ssh copy id i ssh id rsa.pub danran 192.168.198.136 複製本機的公鑰檔案...