我正在使用Devise-1.5.4和Rails 3.0.20。以下是我所知道的事实:
current_user
,authenticate_user!
来验证用户。authenticate!
,它本身调用serialize_from_cookie
,使用remember_token
对用户进行身份验证。我对session_id的使用感到有点困惑。
remember_token
)时会发生什么?设计如何验证current_user?答案 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文档和监护代码对于理解整个流程非常有帮助。您可以在监护代码中输入调试打印/日志行并运行您的应用程序以了解所有这些是如何工作的。