在我的应用中,我有一个User
模型,它有一个rememberable_token
列。创建用户时,随机安全字符串将保存在before_create
过滤器中,以充当用户的安全令牌:
user.rememberable_token = SecureRandom.urlsafe_base64
在会话控制器中,它会创建一个具有该令牌值的永久cookie,以便用户在关闭浏览器时不会被注销,只有在通过logout
操作注销时才会被注销:
会话控制器:
def create
.
.
cookies.permanent.signed[:permanent_user_session] = user.rememberable_token
end
def logout
cookies.delete :permanent_user_session
redirect_to root_url
end
在应用程序控制器中使用cookie来确定是否存在当前用户以及在少数控制器中使用的before_filter,以确定用户是否已登录并获得授权。
应用程序控制器:
def current_user
@current_user ||= User.find_by_rememberable_token(cookies.signed[:permanent_user_session]) if cookies.signed[:permanent_user_session]
end
def authorize
unless User.find_by_rememberable_token(cookies.signed[:permanent_user_session])
render :action => 'login'
end
end
问题是这是否安全或者是否容易遭到会话劫持?如果它容易被劫持,那么如果在session#logout
方法中它在删除现有cookie之前为用户创建了一个新的rememberable_token(但没有创建具有该值的新cookie),它会没有问题吗?
谢谢。
答案 0 :(得分:1)
如果有人在窃取cookie,请输入以下代码:
def current_user
@current_user ||= User.find_by_rememberable_token(cookies.signed[:permanent_user_session]) if cookies.signed[:permanent_user_session]
end
仍然可以使用。在注销方法中,您必须从用户表中删除令牌并在登录时重新创建。
基本上,您在创建时所做的工作应该在每次登录时完成,并在每次注销时恢复。
答案 1 :(得分:0)
我可能会这样做:
在会话上创建:
random_string = SecureRandom.urlsafe_base64
cookies.permanent.signed[:permanent_user_session] = random_string
user.rememberable_token = Digest::MD5.hexdigest(random_string) && user.save
会话破坏:
cookies.delete :permanent_user_session
在应用程序控制器中:
def current_user
@current_user ||= User.find_by_rememberable_token(Digest::MD5.hexdigest(cookies.signed[:permanent_user_session])) if cookies.signed[:permanent_user_session]
end
def authorize
unless @current_user
render :action => 'login'
end
end
这样,您可以存储令牌的哈希值,并为每次新登录重新生成一个新的哈希值(并在每次注销时过期)。 Rails负责CSRF,但长期会议可能不是一个好主意。