2014-02-14 56 views
16

我想了解在使用rails/devise登录用户时发生了什么。rails/devise如何处理cookie会话?

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

现在搞什么的是:rails如何处理浏览器通过cookie传递的会话信息?

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

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

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

谢谢!

+1

Devise在数据库中存储了一些信息('last_sign_in_at','last_sign_in_ip'等),但依靠cookies来模拟超时状态会话一致性。该cookie具有“TTL”或生存时间,并且在检查“记住我”时将该cookie写入浏览器。 (根据我的理解,这至少是默认/最典型的系统,相对于设计) – mecampbellsoup

回答

11

默认的rails会话存储是CookieStore。这意味着所有会话数据都存储在cookie中,而不是存储在任何地方的数据库中。在Rails 3.2中,cookie被签名以防止被篡改,但没有加密。在Rails 4中,它通常是默认加密的。它在Cookie中的事实是它在整个服务器重启过程中如何持续存在。这也意味着你只能存储4k的数据,并且你不想在Rails中存储任何敏感的东西。< 4.最好在会话中保留最少的数据。

您也可以选择将会话数据存储在数据库中,并且只在Cookie中拥有会话标识。

这个答案我给一周有一些额外的信息,可能是有用的:

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

此外,对于的CookieStore轨道API文档给出了一个很好的总结:

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

+0

我认为,当你说“它是如何在重启服务器时持续存在的”,你的意思是“它是如何持续存在的重新启动浏览器/客户端“...? – mecampbellsoup

+0

我的确意味着重启服务器,因为问题是:“请注意,重启服务器不会终止会话,当然可以,但现在我真的很想知道这里发生了什么样的魔术?”,所以我的观点是它在服务器重启过程中持续存在的原因是它存储在客户端的cookie中,因此独立于服务器重启。当然,它也可以在浏览器重新启动时持续存在,具体取决于cookie到期时间。 – Tim

+0

所以,如果我在轨道4,我的应用程序是后端服务器独立?其会话亲和力是否可用? – simo