【问题标题】:How does rails/devise handle cookie sessions?rails/devise 如何处理 cookie 会话?
【发布时间】:2014-02-14 15:17:02
【问题描述】:

我想了解使用 rails/devise 登录用户时的实际情况。

我创建了一个最小的 rails 应用程序,安装了设计并创建了一个 User 设计模型。 一切正常,当我登录(使用remember me)时,我得到了一个会话cookie,正如预期的那样。

现在困扰我的是:rails 如何处理浏览器通过 cookie 传递的会话信息?

我天真地期望将一些信息存储在数据库中,但我不知道在哪里。没有 session 表之类的东西,Users 中没有会话列,我在 tmp 目录中找不到任何感兴趣的内容。

请注意,重新启动服务器不会终止我的会话。这当然是意料之中的,但现在我真的很想知道这里发生了什么样的魔法?

换句话说:服务器如何检查 cookie 的有效性以验证用户身份?

谢谢!

【问题讨论】:

  • Devise 将一些信息存储在数据库中(last_sign_in_atlast_sign_in_ip 等),但依赖 cookie 来模拟有状态会话的超时一致性。 Cookie有一个“TTL”或时间的时间,并且当检查“记住我”时,Cookie将写入浏览器。 (据我了解,这至少是相对于 Devise 的默认/最典型系统。)

标签: ruby-on-rails authentication devise


【解决方案1】:

默认的 Rails 会话存储是 CookieStore。这意味着所有会话数据都存储在 cookie 中,而不是任何地方的数据库中。在 Rails 3.2 中,cookie 被签名以防止篡改,但未加密。在 Rails 4 中,默认情况下它通常是加密的。它在 cookie 中的事实是它如何在服务器重新启动时持续存在。这也意味着您只能存储 4k 的数据,并且您不想在 Rails

您还可以选择将会话数据存储在数据库中,并且只在 cookie 中包含会话 ID。

我在前一周给出的这个答案有一些可能有用的额外信息:

Sessions made sense to me before I started reading about them online

此外,CookieStore 的 rails api 文档给出了一个很好的总结:

http://api.rubyonrails.org/classes/ActionDispatch/Session/CookieStore.html

【讨论】:

  • 我认为当您说“它是如何在服务器重启后持续存在的”时,您的真正意思是“它在浏览器/客户端重启后如何持续存在”......?
  • 我确实是指跨服务器重启,因为问题说“请注意,重启服务器不会终止我的会话。这当然是意料之中的,但现在我真的想知道是什么样的这里发生了魔法?”,所以我的观点是,它在服务器重新启动后仍然存在的原因是它存储在客户端的 cookie 中,因此与服务器重新启动无关。当然,它也可以在浏览器重新启动后持续存在,具体取决于 cookie 过期时间。
  • 所以如果我在 Rails 4 上,我的应用程序是独立于后端服务器的吗?并且它的会话亲和力免费?
猜你喜欢
  • 2014-05-25
  • 1970-01-01
  • 2012-06-28
  • 2011-11-30
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
相关资源
最近更新 更多