我正在使用 Devise-1.5.4 和 Rails 3.0.20。以下是我所了解的事实:
- 浏览器有一个session_id的Cookie,它可以帮助普通应用程序唯一地跟踪会话。可能有也可能没有用户登录。
- 如果用户已登录(并假设他选择了 Remember_me),则浏览器中还会有另一个用于 Remember_user_token 的 Cookie。
- 在我的应用程序中,我使用(设计提供的)方法,例如current_user https://github.com/plataformatec/devise/blob/v1.5/lib/devise/controllers/helpers.rb#L55, authenticate_user! https://github.com/plataformatec/devise/blob/v1.5/lib/devise/controllers/helpers.rb#L46验证用户。
- 上述方法调用authenticate! https://github.com/plataformatec/devise/blob/v1.5/lib/devise/strategies/rememberable.rb#L19,它本身称为serialize_from_cookie https://github.com/plataformatec/devise/blob/v1.5/lib/devise/models/rememberable.rb#L114,使用
remember_token
对用户进行身份验证。
我对session_id的用法有点困惑。
- 什么时候使用,如何使用?
- 如果用户登录,为了让我的 Rails 应用程序(或设备)能够唯一标识该用户,它是否会使用 session_id ?
- 当用户不选择 Remember_me 时会发生什么(并且没有
remember_token
)? devise 如何验证 current_user?
顾名思义,会话 cookie 仅对当前浏览器会话有效,即,如果浏览器退出并重新打开,则会话 cookie 不可用(除非您执行恢复会话之类的操作,在这种情况下,浏览器会恢复上一个会话中的 cookie) 。
请记住 cookie,以便将登录时间延长到当前会话之后。
Devise 使用 Warden,其工作方式是:
1) Devise 向 Warden 注册了多种策略 - 即:基于会话密钥的身份验证、来自参数的身份验证、来自记住令牌的身份验证等。
2)当请求到来时,典狱长运行每一个策略
3) 如果任何一个策略成功验证请求管理员设置“用户”(稍后通过 current_user 帮助器方法获得)并停止运行后续策略
4)如果没有一个策略成功,则声明当前没有用户登录(并且current_user将返回nil)
因此,在您的情况下,如果设置了 session_id (即密钥warden.user.user.key
设置为有效的用户 ID)基于会话的身份验证策略成功,并且用户被视为已登录。如果该会话不可用,则典狱长将继续执行下一个策略,并随后到达“auth from Remember_token”策略。该策略检查记住 cookie 是否存在。如果存在,则从该 cookie 获取令牌,验证它是否仍然有效且未过期。如果是这样,则它设置“用户”并且用户被视为已登录。
如果令牌再次过期,则认为用户未登录。
如果登录时用户未选择 Remember_me,则记住令牌不会设置在记住 cookie 中。在这种情况下,如果用户关闭浏览器并再次打开它(不恢复之前的会话),则用户将不再登录到您的系统。
阅读 Warden 文档和 Warden 代码对于理解整个流程非常有帮助。您可以在典狱长代码中放入调试打印/日志行并运行您的应用程序以了解所有这些是如何工作的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)