使用Devise的Rails应用程序对session_id和remember_user_token的使用之间的区别

时间:2014-09-05 12:45:45

标签: ruby-on-rails ruby ruby-on-rails-3 cookies devise

我正在使用Devise-1.5.4和Rails 3.0.20。以下是我所知道的事实:

  1. 浏览器中有一个用于session_id的Cookie,可帮助普通应用程序唯一跟踪会话。可能有也可能没有用户登录。
  2. 如果用户已登录(并假设他选择了remember_me),则浏览器中还有另一个与remember_user_token相关的Cookie。
  3. 在我的应用程序中,我使用(设计提供的)方法,如current_userauthenticate_user!来验证用户。
  4. 以上方法调用authenticate!,它本身调用serialize_from_cookie,使用remember_token对用户进行身份验证。
  5. 我对session_id的使用感到有点困惑。

    1. 什么时候使用,怎么样?
    2. 如果用户已登录,对于我的rails应用程序(或设计)来唯一标识用户,是否会使用session_id?
    3. 当用户没有选择remember_me(并且没有remember_token)时会发生什么?设计如何验证current_user?

1 个答案:

答案 0 :(得分:4)

会话cookie,顾名思义,仅对当前浏览器会话有效,即如果浏览器退出并重新打开则不可用(除非您执行类似恢复会话的操作,在这种情况下浏览器会从中恢复cookie上一届会议)。

请记住Cookie,以便将登录时段延长到当前会话之外。

Devise使用warden及其工作方式是:

1)Devise使用warden注册几个策略 - 即:基于会话密钥的auth,来自params的auth,来自记忆令牌的auth等。
2)当请求进入监狱长时,每个策略都会运行 3)如果任何一个策略成功验证请求warden设置" user" (稍后通过current_user帮助方法获得)并停止运行后续策略
4)如果没有一个策略成功,则声明当前没有用户登录(并且current_user将返回nil)

因此,在您的情况下,如果设置了session_id(即密钥warden.user.user.key设置为有效的用户ID),则基于会话的身份验证策略会成功,并且用户被视为已登录。如果该会话不可用然后,监狱长转向下一个策略,然后从remember_token"到达#ce;战略。此策略检查是否存在记住cookie。如果出现,则从该cookie获取令牌,验证它是否仍然有效且未过期。如果是,则设置" user"并且用户被视为已登录。 如果令牌再次过期,则认为用户未登录。

如果登录用户时没有选择remember_me,则记忆标记中未设置记忆标记。在这种情况下,如果用户关闭浏览器并再次打开它(不恢复上一个会话),则用户不再登录到您的系统。

阅读Warden文档和监护代码对于理解整个流程非常有帮助。您可以在监护代码中输入调试打印/日志行并运行您的应用程序以了解所有这些是如何工作的。