Rails临时会话cookie& db reset

时间:2017-10-26 16:21:16

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

我正在完成迈克尔·哈特尔的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的重新分配都是如此。尽管如此,我还是想知道这种情况是如何处理的,以及通常采取哪些措施来避免这种情况。非常感谢!

1 个答案:

答案 0 :(得分:1)

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

bundle exec rake tmp:sessions:clear

如果您正在使用数据库会话,则可以运行此会话以清除所有会话:

bundle exec rake db:sessions:clear

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

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