企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 用户认证 当前已经认证的用户信息被保存在每一个请求处理器的 `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 数据库中保存用户数据)。