2014-09-05 75 views
0

我正在使用Devise-1.5.4和Rails 3.0.20。这里是我知道的事实:Rails应用程序使用session_id和remember_user_token与Devise的区别

  1. 有一个session_id的cookie与浏览器,这有助于一个正常的应用程序唯一跟踪会话。可能有也可能没有用户登录。
  2. 如果用户已登录(并且假设他选择了remember_me),那么在浏览器中还有另一个用于remember_user_token的Cookie。
  3. 在我的应用程序中,我使用(设计提供的)方法,如current_user,authenticate_user!来验证用户。
  4. 上述方法调用authenticate!,它自己调用serialize_from_cookie,它使用remember_token来验证用户。

我对使用session_id有点困惑。

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

回答

4

会话cookie,顾名思义,是适用于当前浏览器会话只,也就是说,如果浏览器退出并重新打开(除非你做类似的恢复会话在这种情况下,浏览器恢复它不可来自上届会议的cookies)。

记住cookie用于将登录期限延长到当前会话之外。

设计使用监狱长和它的工作方式是:

1)设计注册多种策略监狱长 - 即:从记得令牌等
2)当会话密钥基于身份验证,从PARAMS AUTH,AUTH 3)如果任何一种策略成功地验证了请求,那么管理员设置“用户”(你通过后面的current_user辅助方法获得)并停止运行后续策略。4)如果没有任何一个策略该策略成功声明没有用户当前登录(并且current_user将返回零)

所以在你的情况下,如果session_id被设置(即,密钥warden.user.user.key被设置为有效的用户ID)基于会话的认证策略成功并且用户被认为已登录。如果该会话不可用,那么监管人员转向下一个策略,并且随后到达“来自remember_token的策略”的策略。该策略检查是否存在记忆cookie。如果存在,从该cookie获取该令牌,验证它是否仍然有效且未过期。如果是,则设置“用户”,并且用户被认为已登录。 如果令牌再次过期,则用户被认为未登录。

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

通过守望者文档和守护代码的阅读将有助于理解整个流程。您可以在warden代码中放入调试打印/日志行,并运行您的应用程序以了解所有这些工作是如何工作的。

+0

感谢您的精心解答。很有帮助。肯定会通过'warden'的代码来探索。 – 2014-09-05 14:17:49

相关问题