Rails 请问大家一个关于 rails 用户登录的问题

shangrenzhidao · 2014年11月04日 · 最后由 simonykq 回复于 2014年11月09日 · 2675 次阅读
def create
user = User.find_by(name: params[:name])
if user and user.authenticate(params[:password])
    session[:user_id] = user.id # user_id
    redirect_to admin_url
else
redirect_to login_url, alert: "Invalid user/password combination"
 end
end



大家请看上面的一段代码,我的疑惑是 session 的 key :user_id 是不是和当前登录的用户有一定的关系呢?如果 A 用户和 B 用户 都登录的话,:user_id 这个 symbol 是不是会不同呢?写到这我发现我问题有些愚蠢,难道 session 对象中有一个 user_id 字段?不知道我有没有表述清楚。求解释。

session 直译就是会话,我的理解就是一个用户连接到服务器时,这个用户就有一个可用的 session 会话开启,在你举的例子里也就是说一个用户一个 session 字典 (hash), 所以各个用户的 session[:user_id] 是单独的

#1 楼 @cifery 同一用户两次不同的登录也会产生不同的 session 字典?

#2 楼 @shangrenzhidao 我的理解是这样的,不知道有没有错误,毕竟大部分时间都是拿来就用,还真没像你这样深入的想过,我的认知是:只要浏览器没有关闭,session 就会存在,要是关闭了浏览器,会新开 session 会话,所以,一般用户登录用 session 保存用户 id,这样在用户的一次浏览行为中,只要不关闭浏览器,网站各个页面就能认出这个用户是已登录用户,但是要做持久化比如 remember me 这个功能就要用到客户端的 session,也就是 cookie

你的 session 会保留在你的客户端上。

因为 user 的 id 各不相同,所以通过 session.user_id 可以识别不同的用户。session 中当然是有 user_id,这个 user_id 保存在 cookie 中。

#5 楼 @gyorou rails 里是不是把 session 看成一个 ActiveRecord?

#3 楼 @cifery 谢谢你这么详细的解释。

@shangrenzhidao 翻了一下 rails 源码,Session 是 ActiveSupport::Cache::Store

#6 楼 @shangrenzhidao 看成什么不重要吧,这里就是其实 session 就一个 hash 而已。

#6 楼 @shangrenzhidao 看成什么不重要吧,这里就是其实 session 就一个 hash 而已。

#8 楼 @cifery 我也看了,和设想的不一样

Session 里默认情况下就是保存在用户浏览器里的一段被你的 rails 应用签过名的 cookie 值。里面包含了登录用户的 user_id。Rails4 中,cookies 值会被加密

需要 登录 后方可回复, 如果你还没有账号请 注册新账号