我正在完成迈克尔·哈特尔的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的重新分配都是如此。尽管如此,我还是想知道这种情况是如何处理的,以及通常采取哪些措施来避免这种情况。非常感谢!
答案 0 :(得分:1)
根据this answer,如果您使用的是基于文件的会话,则可以使用以下命令清除所有Rails会话:
bundle exec rake tmp:sessions:clear
如果您正在使用数据库会话,则可以运行此会话以清除所有会话:
bundle exec rake db:sessions:clear
您还可以更改secret_key_base
中的config/secrets.yml
会话无效。
这应该清除所有用户的所有会话。它会记录每个用户并使其会话无效,但这是确保旧cookie在迁移数据库后无法访问用户数据的最安全方式。