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

有帮助吗?

解决方案

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

这是我所做的:

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

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

其他提示

几乎可以肯定,您不应该延长会话 cookie 的寿命。

虽然不是专门处理轨道 本文 详细解释了“记住我”的最佳实践。

总之,你应该:

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

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

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

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

Railscasts #67 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. 在供应商/插件目录中包含一个文件
  2. 仅使用一行在应用程序控制器中设置会话到期值

我会选择 Devise 来获得出色的轨道身份验证解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top