在 Hartl 的教程 Listing 8.49 中,为什么有一个 "forget(user)" 选项?

In Hartl's tutorial, Listing 8.49, why is there a "forget(user)" option?

这与允许用户在关闭浏览器时保持登录状态的复选框有关。在中间版本中,无论如何我们都记住了用户,现在我们正在检查参数以查看是否设置了复选框。这是让我困惑的代码行:

params[:session][:remember_me] == '1' ? remember(user) : forget(user)

具体来说,如果 params[:session][:remember_me] 为 0,为什么我们会忘记用户?因为我们从来没有记住用户(我想——我是一个主要的新手),这行不通吗:

remember(user) if (params[:session][:remember_me] == '1')

更有意义?我试过了,它通过了测试(这是非常基本的),但它似乎也表现得很好。但也许有一些杂散变量保持不变,我错过了,因为我不知道我在做什么。

我处于完全相同的位置,并且想知道完全相同的事情。

然后我得出结论:这只是安全问题。
因为如果用户从不退出您的应用程序,那么窃取她 user_idremember_token cookie 的攻击者可以一直使用它们。但是,如果用户最终在另一台计算机上登录,则 remember_digest 属性会获得一个新值或设置为 nil。无论哪种方式,攻击者都会被锁定。
通过省略 forget(user),唯一一次将 remember_digest 设置为 nil 是在用户故意注销时。

但是版本 remember(user) if (params[:session][:remember_me] == '1') 使用户能够 select 一台 "remembered" 计算机。