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

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

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

我对session_id的使用有点困惑。

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

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

记住cookie,将登录时间延长到当前会话之外。

Devise使用warden,它的工作方式是:

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

因此,在您的情况下,如果设置了session_id(即密钥warden.user.user.key设置为有效的用户ID),则基于会话的身份validation策略会成功,并且用户被视为已登录。如果该会话不可用,则warden继续进行下一个策略,随后到达“来自remember_token的auth”战略。 此策略检查是否存在记住cookie。 如果出现,则从该cookie获取令牌,validation它是否仍然有效且未过期。 如果是,那么它设置“用户”并且用户被视为已登录。如果令牌再次过期,则认为用户未登录。

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

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