所以我正在关注Rails 教程,我已经到了我们想要使用 sign_in SessionHelper 登录用户的部分。
问题一:
module SessionsHelper
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
current_user = user
end
def current_user=(user) #set current_user
@current_user = user
end
def current_user #get current_user
@current_user
end
我遇到的困难是这部分内容:
问题是它完全无法解决我们的问题:使用该代码,用户的登录状态将被遗忘:只要用户转到另一个页面。
我不明白这是怎么回事?我继续阅读并理解添加的代码确保@current_user 永远不会为零。但是如果我们只是在第 5 行建立它,我看不到 current_user 将如何恢复为零。
问题 2:
更新后的代码如下:
module SessionsHelper
def sign_in(user) #in helper because used in view & controller
cookies.permanent.signed[:remember_token] = [user.id, user.salt]
current_user = user
end
def current_user=(user) #set current_user
@current_user = user
end
def current_user #get current_user
@current_user ||= user_from_remember_token #<-- short-circuit evaluation
end
private
def user_from_remember_token
User.authenticate_with_salt(*remember_token) #*=use [] instead of 2 vars
end
def remember_token
cookies.signed[:remember_token] || [nil, nil]
end
end
在 remember_token 助手中,为什么它使用 cookies.signed[] 而不是 cookies.permanent.signed[] 以及为什么不使用我们刚刚学习的 ||= 运算符?
问题 3:
为什么我们需要authenticate_with_salt?如果我进行身份验证和登录可以看到传递给它的用户的 id 和 salt 属性,为什么我们需要 double_check 呢?什么样的情况会引发混淆?