### 用户认证
当前已经认证的用户信息被保存在每一个请求处理器的 `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 数据库中保存用户数据)。