### 用戶認證
當前已經認證的用戶信息被保存在每一個請求處理器的 `self.current_user` 當中, 同時在模板的 `current_user` 中也是。默認情況下,`current_user` 為 `None`。
要在應用程序實現用戶認證的功能,你需要復寫請求處理中 `get_current_user()` 這 個方法,在其中判定當前用戶的狀態,比如通過 cookie。下面的例子讓用戶簡單地使用一個 nickname 登陸應用,該登陸信息將被保存到 cookie 中:
```
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.write('<html><body><form action="/login" method="post">'
'Name: <input type="text" name="name">'
'<input type="submit" value="Sign in">'
'</form></body></html>')
def post(self):
self.set_secure_cookie("user", self.get_argument("name"))
self.redirect("/")
application = tornado.web.Application([
(r"/", MainHandler),
(r"/login", LoginHandler),
], cookie_secret="61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=")
```
對于那些必須要求用戶登陸的操作,可以使用裝飾器 `tornado.web.authenticated`。 如果一個方法套上了這個裝飾器,但是當前用戶并沒有登陸的話,頁面會被重定向到 `login_url`(應用配置中的一個選項),上面的例子可以被改寫成:
```
class MainHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
name = tornado.escape.xhtml_escape(self.current_user)
self.write("Hello, " + name)
settings = {
"cookie_secret": "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
"login_url": "/login",
}
application = tornado.web.Application([
(r"/", MainHandler),
(r"/login", LoginHandler),
], **settings)
```
如果你使用 `authenticated` 裝飾器來裝飾 `post()` 方法,那么在用戶沒有登陸的狀態下, 服務器會返回 403 錯誤。
Tornado 內部集成了對第三方認證形式的支持,比如 Google 的 OAuth 。參閱 [`auth` 模塊](http://github.com/facebook/tornado/blob/master/tornado/auth.py) 的代碼文檔以了解更多信息。 for more details. Check`auth` 模塊以了解更多的細節。在 Tornado 的源碼中有一個 Blog 的例子,你也可以從那里看到 用戶認證的方法(以及如何在 MySQL 數據庫中保存用戶數據)。