ruby on rails - tutorial - 在Rails应用程序中实现“记住我”




ruby入门 (6)

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



您几乎应该确定不会延长会话cookie的寿命。

尽管没有专门讨论Rails, 但本文还是花了一些时间来解释“记住我”的最佳实践。

总之,尽管您应该:

  • 向用户表添加额外的列以接受较大的随机值
  • 在客户端上设置一个长期存在的cookie,该cookie结合了用户ID和随机值
  • 当新会话开始时,请检查id / value cookie是否存在,并验证新用户是否匹配。

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

最后要说明的是,他给出的关于使某些功能(密码更改/电子邮件更改等)无法用于自动身份验证的会话的建议非常值得遵循,但在现实世界中很少见。


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

railscasts#67 restful_authentication

这是插件本身的链接

restful_authentication


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

这是我所做的:

  • 会话Cookie设置为有效期(大约6个月)
  • 在会话存储中
    • “过期时间”日期设置为登录+ 24小时
    • 用户身份
    • Authenticated = true,因此我可以允许匿名用户处理(由于cookie篡改保护而没有危险)
  • 我在应用程序控制器中添加了一个before_filter,用于检查会话的“过期时间”部分。

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







http