【发布时间】: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