在 Rails 应用程序中实现“记住我”

我的 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

但这似乎是一种黑客行为,对于如此常见的功能而言,这令人惊讶。有没有更好的办法?

编辑

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

请先 登录 后评论

2 个回答

Daniel Beardsley

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

这是我所做的:

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

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

请先 登录 后评论
Teflon Ted

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

请先 登录 后评论