【问题标题】:standard way to handle user session in tornado在龙卷风中处理用户会话的标准方法
【发布时间】:2013-03-06 17:55:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: python tornado


    【解决方案1】:

    这是其他微框架处理会话的方式(例如 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 可能会有所帮助使用它),并且在收到超时会话后,您可以通过创建新会话并将任何相关信息从旧会话传输到其中来重新验证新用户。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 在使用客户端 cookie 时要非常小心,即使它们是“安全”cookie。例如,如果用户回滚到以前的安全 cookie,服务器不信任该 cookie 但不再有效怎么办?见Why store sessions on the server instead of inside a cookie?
      • @JasonCG,是的。这就是世界升级到 JWT - jwt.io 的原因。我也同意这个问题的答案 - 你不应该将用户余额存储在 cookie / 令牌 / 等中。余额操作非常重要,因此它们应该具有最大的一致性。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        有一个为 Tornado 提供会话管理的 Github 项目。即使您决定不使用它,它也可以让您深入了解如何构建自己的会话管理。 Github 项目名为dustdevil。完全公开 - 我们几年前创建了它,但发现它非常易于使用,并且今天已在积极使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-12
          相关资源
          最近更新 更多