14

所以,为了避免“没有一个最佳答案”的问题,我要问的不是最好的方式,而是使用 Tornado 框架时处理会话的标准或最常见的方式。也就是说,如果我们不使用 3rd 方身份验证(OAuth 等),而是希望在浏览器中拥有自己的带有安全 cookie 的用户表,但大多数会话信息存储在服务器上,那么最常见的方法是什么?我看到有些人使用 Redis,有些人使用他们的普通数据库(MySQL 或 Postgres 或其他),有些人使用 memcached。

我正在开发的应用程序一次不会有数百万用户,甚至可能不会有数千用户。不过,它最终需要获得一些适度复杂的授权方案。我正在寻找的是确保我们不会做一些与一般 Tornado 社区不同的“奇怪”事情,因为身份验证和授权虽然是我们需要的东西,但不是在我们产品的核心,因此不是我们应该区分自己的地方。因此,我们正在寻找大多数人(使用 Tornado)在这方面所做的事情,因此我认为这是一个(理论上)客观真实答案的问题。

当然,理想的答案是指向示例代码。

4

4 回答 4

17

以下是其他微框架处理会话的方式(例如 CherryPy、Flask):

  1. 在每个会话的基础上创建一个表格session_id和您想要跟踪的任何其他字段。一些框架将允许您仅将这些信息存储在每个用户的文件中,或者直接将内容存储在内存中。如果您的应用程序足够小,您也可以考虑这些选项,但您自己实现数据库应该更简单。
  2. 当收到请求(RequestHandler initialize()我认为是函数?)并且没有 session_id cookie 时,使用随机生成器设置一个安全的 session-id。我对 Tornado 没有太多经验,但看起来设置一个安全的 cookie 应该对此有用。将该session_id信息和相关信息存储在您的会话表中。请注意,每个用户都会有一个会话,即使是那些未登录的用户。当用户登录时,您需要将他们的登录状态(以及他们的用户名/用户 ID 等)附加到他们的会话中。
  3. 在您的RequestHandler初始化函数中,如果有一个 session_id cookie,请从数据库中读取您需要的任何会话信息,并可能创建您自己的 Session 对象来填充并存储为该请求处理程序的成员变量。

请记住,会话应该在一定量的不活动后过期,因此您也需要检查一下。如果您想要“记住我”类型的登录情况,则必须使用安全 cookie 来发出信号(在 OWASP 阅读此内容以确保它尽可能安全,再次认为 Tornado 的 secure_cookie 可能会有所帮助使用它),并且在收到超时会话后,您可以通过创建新会话并将任何相关信息从旧会话传输到其中来重新验证新用户。

于 2013-05-01T14:59:03.300 回答
14

Tornado 设计为无状态并且没有开箱即用的会话支持。

使用安全 cookie 存储敏感信息,例如 user_id。使用标准 cookie 来存储非关键信息。

对于存储大对象 - 使用标准方案 - MySQL + memcache。

于 2013-03-07T07:36:10.600 回答
4

会话的关键问题不是将它们存储在哪里,而是如何智能地使它们过期。无论会话存储在哪里,只要存储的会话数量合理(即仅存储活动会话加上一些剩余的会话),所有这些数据都将适合 RAM 并快速提供服务。如果有很多旧垃圾,您可能会预料到无法预测的延迟(需要点击磁盘来加载会话)。

于 2013-05-02T20:17:29.550 回答
3

为此目的,Tornado 中没有直接内置任何东西。正如其他人已经评论的那样,Tornado 被设计为一个非常快速的异步框架。它设计精益。但是,可以加入您自己的会话管理功能。您需要为每个将创建或获取会话容器的处理程序添加一个序言部分。您需要将会话 ID 存储在 cookie 中。如果您不是严格意义上的 HTTPS,那么您将需要使用安全 cookie。会话持久性可以是您选择的任何技术,例如 Redis、Postgres、MySQL、文件存储等...

There is a Github project that provides session management for Tornado. Even if you decide not to use it, it can provide insight into how to structure your own session management. The Github project is called dustdevil. Full disclosure - we created this several years ago but find it very easy to use and have it in active use today.

于 2016-03-10T14:04:26.587 回答