【问题标题】:Rails temporary session cookies & db resetRails 临时会话 cookie 和数据库重置
【发布时间】:2018-04-08 03:04:19
【问题描述】:

我正在阅读 Michael Hartl 的 Rails 教程,其中有一节他让您使用假用户为开发数据库播种。此过程的第一步是运行rails db:migrate:reset,然后运行db:seed

当我运行这些命令时,我恰好在浏览器中登录了应用程序。 因此,我的浏览器中仍然存储了一个临时会话 cookie(通过session[:user_id] = user.id 设置)。我的用户 ID 是 3。

因此,我发现在为数据库播种后,我可以刷新浏览器并以 ID 现在为 3 的新用户身份登录。

与此相关:注销应用程序会删除会话 cookie(通过session.delete(:user_id))。但我发现如果您要 (1) 在登录时复制 cookie,(2) 注销并关闭浏览器,以及 (3) 重复使用复制的 cookie(在同一浏览器或另一台机器/浏览器中) ),您仍然会自动进行身份验证和登录,而无需用户/密码。是否有一种标准方法可以防止在注销后再次使用特定的 cookie?

这两种情况都有效,因为此current_user 方法中的第一个条件通过并将ID # 分配给user_id

# Returns the current logged-in user (if any).
def current_user
  if (user_id = session[:user_id])
    @current_user ||= User.find_by(id: user_id)
  elsif (user_id = cookies.signed[:user_id])
    user = User.find_by(id: user_id)
    if user && user.authenticated?(cookies[:remember_token])
      log_in user
      @current_user = user
    end
  end
end

也许这两种情况都是非常罕见的情况。在第一种情况下,我认为重置生产应用程序的数据库是非常不可取的,任何重新分配记录 ID 也是如此。不过,我想知道这种情况有多严重,通常会采取哪些措施来避免这种情况。非常感谢!

【问题讨论】:

  • 不要害怕为您认为有用的问题点赞。

标签: ruby-on-rails session cookies session-cookies railstutorial.org


【解决方案1】:

根据this answer,如果您使用基于文件的会话,您可以使用以下命令清除所有 Rails 会话:

bundle exec rake tmp:sessions:clear

如果你正在使用数据库会话,你可以运行它来清除所有会话:

bundle exec rake db:sessions:clear

您还可以通过更改 config/secrets.yml 中的 secret_key_base 来使会话无效。

这应该清除所有用户的所有会话。它将注销每个用户并使他们的会话无效,但这是确保旧 cookie 在迁移数据库后无法访问用户数据的最安全方法。

【讨论】:

  • 这似乎对我不起作用。我得到了以下回溯:Don't know how to build task 'tmp:sessions:clear' (see --tasks)1 我还检查了tmp 中没有sessions 目录。也许只是本教程没有使用它?您链接到的答案建议rake tmp:sessions:clear 有一些响应表明当所有数据都存储在客户端时这不起作用。所以我可以推断出一个应该将它存储在服务器端。有没有用 Rails 实现的标准方法? session[:key] = value 似乎默认为客户端。
  • 您可能正在使用数据库会话。我扩展了答案,包括清除数据库会话和更改密钥库。其中一个或两个都应该有效。
  • @tom-arnarda 是的,有效(将secret_key_base 更改为config/secrets.yml)。非常感谢。所以我想要做的是在迁移数据库时更改此密钥?或者至少在诸如 User.id 之类的东西存储在客户端会话中的情况下。但是,对于注销的个人用户,有没有办法防止他们登录的会话 cookie 被重用?我猜您需要记录所有正在使用的会话?
  • 有很多方法,但这属于一个单独的问题。 :)
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 2010-10-29
  • 2023-03-27
  • 2013-04-28
  • 2013-04-08
相关资源
最近更新 更多