57

我的 Rails 应用程序有一个带有“记住我”复选框的登录框。选中该框的用户即使在关闭浏览器后仍应保持登录状态。我通过将用户的 id 存储在用户的会话中来跟踪用户是否登录。

但是会话在 Rails 中作为会话 cookie 实现,它不是持久的。我可以他们坚持:

class ApplicationController < ActionController::Base
  before_filter :update_session_expiration_date

  private

  def update_session_expiration_date
    options = ActionController::Base.session_options
    unless options[:session_expires]
      options[:session_expires] = 1.year.from_now
    end
  end
end

但这似乎是一种 hack,这对于这种常见的功能来说是令人惊讶的。有没有更好的办法?

编辑

Gareth 的回答非常好,但我仍然希望熟悉 Rails 2 的人回答(因为它是独一无二的CookieSessionStore)。

4

7 回答 7

29

您几乎可以肯定不应该将会话 cookie 延长为长期存在。

尽管本文没有专门讨论 Rails ,但本文还是详细解释了“记住我”的最佳实践。

总之,虽然你应该:

  • 向用户表添加额外的列以接受较大的随机值
  • 在客户端上设置一个长寿命的 cookie,它结合了用户 ID 和随机值
  • 当新会话开始时,检查 id/value cookie 是否存在,如果匹配,则对新用户进行身份验证。

作者还建议在每次登录时使随机值无效并重置 cookie。就我个人而言,我不喜欢这样,因为您无法在两台计算机上保持登录状态。我倾向于确保我的密码更改功能也重置随机值,从而锁定其他机器上的会话。

最后一点,他给出的关于使某些功能(密码更改/电子邮件更改等)对自动认证会话不可用的建议非常值得遵循,但在现实世界中很少见。

于 2008-08-02T16:10:42.817 回答
13

我花了一段时间思考这个问题并得出了一些结论。默认情况下,Rails 会话 cookie 是防篡改的,因此您真的不必担心 cookie 在客户端被修改。

这是我所做的:

  • 会话 cookie 设置为长寿命(6 个月左右)
  • 会话存储内部
    • 设置为登录 + 24 小时的“过期”日期
    • 用户身份
    • Authenticated = true 所以我可以允许匿名用户会话(由于 cookie 防篡改保护不危险)
  • 我在应用程序控制器中添加了一个 before_filter 来检查会话的“过期”部分。

当用户选中“记住我”框时,我只是将 session[:expireson] 日期设置为登录 + 2 周。没有人可以窃取 cookie 并永远保持登录状态或伪装成另一个用户,因为 rails session cookie 是防篡改的。

于 2008-09-16T21:37:36.440 回答
11

我建议您查看具有此实现的 RESTful_Authentication 插件,或者只是切换您的实现以使用 RESTful Authentication_plugin。在 Railscasts 上有一个关于如何使用这个插件的很好的解释:

railscasts #67 restful_authentication

这是插件本身的链接

restful_authentication

于 2008-09-17T14:17:34.023 回答
6

restful_authentication 插件有一个很好的实现:

http://agilewebdevelopment.com/plugins/restful_authentication

于 2008-08-06T21:30:25.180 回答
5

请注意,您不想保留他们的会话,只保留他们的身份。当他们返回您的站点时,您将为他们创建一个新会话。通常,您只需为用户分配一个 GUID,将其写入他们的 cookie,然后在他们回来时使用它来查找他们。不要使用他们的登录名或用户 ID 作为令牌,因为它很容易被猜到并允许狡猾的访问者劫持其他用户的帐户。

于 2008-09-01T21:46:46.840 回答
4

这对我来说就像一个魅力:

http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/

现在我的 CookieStore 会话在两周后到期,因此用户必须再次提交他们的登录凭据才能持续登录两周。

基本上,它很简单:

  1. 在 vendor/plugins 目录中包含一个文件
  2. 仅使用一行在应用程序控制器中设置会话到期值
于 2008-09-20T08:58:47.127 回答
4

我会选择 Devise 来为 Rails 提供出色的身份验证解决方案。

于 2011-01-16T04:26:53.270 回答