繁体   English   中英

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

[英]Implementation of "Remember me" in a Rails application

我的 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,它结合了用户 ID 和随机值
  • 当新会话开始时,检查 id/value cookie 是否存在,如果匹配则验证新用户。

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

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

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

这是我所做的:

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

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

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

railscasts #67 restful_authentication

这是插件本身的链接

restful_authentication

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

http://agilewebdevelopment.com/plugins/restful_authentication

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

这是一个很好的写一个人创建30天持久会话的经验。

警告:博客文章是从2006年开始的

http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html

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

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

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

基本上,它很简单:

  1. 在 vendor/plugins 目录中包含一个文件
  2. 仅使用一行在应用程序控制器中设置会话到期值

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM