session 中的数据是临时性的,不能实现类似remember me 这样的功能
故用cookie来实现,在cookie中添加一个令牌来表明用户的身份
https://api.rubyonrails.org/classes/ActionDispatch/Cookies.html
- 添加一个auth_token 字段到user表来记录用户令牌
rails g migration add_auth_token_to_users
- 在创建user时为每个用户生成一个不重复的随机字符串来当令牌
before_create {generate_token(:auth_token)}
def generate_token column
begin
self[column] = SecureRandom.urlsafe_base64
end while User.exists?(column => self[column])
end
- 之前由session存储的用户信息改由cookie存储
users_controller中:
def create_login_session
user = User.find_by_name params[:name]
if user && user.authenticate(params[:password])
#session[:user_id] = user.id
if params[:remember_me]
cookies.permanent[:auth_token] = user.auth_token #permanent 能够持久化
else
cookies[:auth_token] = user.auth_token
end
redirect_to :root
else
redirect_to :login
end
end
def logout
# session[:user_id] = nil
cookies.delete(:auth_token)
redirect_to :root
end
application_controller 中
def current_user
# @current_user = User.find session[:user_id] if session[:user_id]
@current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
end