Ruby on rails Rails临时会话cookies&;分贝复位

Ruby on rails Rails临时会话cookies&;分贝复位,ruby-on-rails,session,cookies,session-cookies,railstutorial.org,Ruby On Rails,Session,Cookies,Session Cookies,Railstutorial.org,我正在学习MichaelHartl的Rails教程,有一节他让你在开发数据库中植入假用户。这个过程的第一步是运行railsdb:migrate:reset,然后运行db:seed 当我运行这些命令时,我碰巧在浏览器中登录到应用程序。 因此,我仍然在浏览器中存储了一个临时会话cookie(通过会话[:user\u id]=user.id)设置)。我的用户ID是3 因此,我发现在对数据库进行种子设定时,我可以刷新浏览器并作为新用户登录,其ID现在为3 与此相关:注销应用程序将删除会话cookie(通

我正在学习MichaelHartl的Rails教程,有一节他让你在开发数据库中植入假用户。这个过程的第一步是运行
railsdb:migrate:reset
,然后运行
db:seed

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

因此,我发现在对数据库进行种子设定时,我可以刷新浏览器并作为新用户登录,其ID现在为3

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

这两种情况都有效,因为此
当前用户
方法中的第一个条件将ID传递并分配给
用户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的重新分配都是如此。尽管如此,我还是想知道这种情况有多严重,通常会采取什么措施来避免这种情况。非常感谢

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

bundle exec rake tmp:sessions:clear
如果使用的是数据库会话,则可以运行此命令以清除所有会话:

bundle exec rake db:sessions:clear
您还可以在
config/secrets.yml
中更改
secret\u key\u base
时使会话无效


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

这似乎对我不起作用。我得到了以下回溯:
不知道如何构建任务'tmp:sessions:clear'(参见--tasks)1
我也检查了,并且
tmp
中没有
会话
目录。也许这只是本教程没有利用的情况?您链接到的建议
rake tmp:sessions:clear
的答案有一些响应表明,当所有数据都存储在客户端时,这种方法不起作用。所以我可以推断应该将其存储在服务器端。有没有一种标准的方法可以用Rails实现这一点<代码>会话[:key]=value似乎默认为客户端。您可能正在使用数据库会话。我扩展了答案,包括清除数据库会话和更改密钥库。其中一个或两个应该都可以。@tom arnarda Yep有效(在
config/secrets.yml
中更改
secret\u key\u base
)。谢谢。所以我想应该做的是在迁移数据库时更改这个键?或者至少在客户端会话中存储类似User.id的内容的情况下。但是,对于注销的单个用户,是否有方法防止其登录的会话cookie被重用?我想您需要记录所有正在使用的会话?有很多方法,但这属于一个单独的问题。:)不要害怕对你认为有用的问题进行否决。