使用Devise的Rails应用程序使用session_id和remember_user_token之间的区别
我正在使用Devise-1.5.4和Rails 3.0.20。 以下是我所知道的事实:
- session_id与浏览器有一个Cookie,可以帮助普通应用程序唯一地跟踪会话。 可能有也可能没有用户登录。
- 如果用户已登录(并假设他选择了remember_me),那么浏览器中还有另一个与remember_user_token相关的Cookie。
- 在我的应用程序中,我使用(设计提供)方法,如
current_user
,authenticate_user!
validation用户。 - 以上方法调用
authenticate!
,它本身调用serialize_from_cookie
,它使用remember_token
来validation用户。
我对session_id的使用有点困惑。
- 什么时候使用,怎么样?
- 如果用户已登录,对于我的rails应用程序(或设计)来唯一标识用户,它是否会使用session_id?
- 当用户没有选择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代码中输入调试打印/日志行并运行您的应用程序以了解所有这些是如何工作的。