【发布时间】:2018-01-24 05:33:05
【问题描述】:
我正在学习如何使用会话和 cookie 构建简单的身份验证功能。
我有一个User 模型,然后是sessions_controller。我还为 users 表创建 remember_token 列来处理“remember_me”情况。
这是相关代码:
sessions_controller
def create
user = User.find_by_email(params[:email])
if user && user.authenticate(params[:password])
session[:user_id] = user.id
if params[:remember_me]
user.generate_token(:remember_token)
cookies.permanent[:remember_token] = user.remember_token
end
redirect_to root_url
flash[:notice] = "Logged in."
else
render "new"
flash[:notice] = "Invaid email or password."
end
end
user.rb
has_secure_password
def generate_token(column)
self[column] = SecureRandom.urlsafe_base64
self.save
end
application_controller
helper_method :current_user
def current_user
if session[:user_id]
@current_user ||= User.find(session[:user_id])
elsif cookies[:remember_token]
@current_user ||= User.find(cookies[:remember_token])
end
end
上面的代码似乎工作正常。但一开始我实际上把:current_user中的代码顺序颠倒了,像这样:
def current_user
if cookies[:remember_token]
@current_user ||= User.find(cookies[:remember_token])
elsif session[:user_id]
@current_user ||= User.find(session[:user_id])
end
end
这将引发异常:“找不到具有 'id'= some_token_here 的用户”
在这种情况下,为什么我不能首先使用 cookies[:remember_token] 找到用户。顺序重要吗?或者,如果我对会话和 cookie 的工作方式有一些误解?
【问题讨论】:
标签: ruby-on-rails ruby session session-cookies