我正在學習如何使用會話和cookie構建簡單的身份驗證功能。 我有一個User
模型,然後sessions_controller
。我還爲用戶表創建了remember_token
列以處理「remember_me」情況。 這是相關的代碼:在實現「current_user」時,Cookie和會話之間的順序有什麼影響?
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的工作方式有所誤解,
非常感謝@Robin van Dijk的!這就是我想要的。 – Caven