为什么Rails会话在多个用户之间共享

3
我正在尝试使用会话机制来存储已登录用户的信息,如下所示:session[:user_id]=@user_id,这样就可以了。
但是当一个新用户登录应用时,变量session[:user_id]被更新为新用户ID,导致第一个用户使用无效ID执行请求。
我尝试使用不同的浏览器、私人浏览器、虚拟机中的浏览器和主机中的另一个浏览器,仍然遇到了问题。
我希望有一些建议。会话在多个用户之间共享是正常的吗?是否有另一种方法来存储某些特定数据并防止用户之间共享?我以为会话是唯一的,为什么该变量会改变?cookies变量也是同样的情况。 编辑: application_controller
def sign_in
 if(password != "" && @user_id!= "" && jenkinsip != "")
   @client = JenkinsApi::Client.new(:server_url => jenkinsip, :username=> @user_id, :password=> password)
    if(@client.get_jenkins_version != nil)
      session[:user_id]=@user_id
    end
 end
end

在HTML中

默认情况下,会话不会在多个用户(不同的浏览器、计算机等)之间共享。如果会话共享了,则可能是您的代码有问题。请提供您的代码,展示您如何使用“会话”。 - Long Nguyen
我认为你在一个浏览器中使用一个会话,只是更改用户凭据,对吗?如果是这样,你应该以某种方式存储这些特定数据,避免在这些用户之间共享,例如作为哈希值的@user_id键:{ user1 => data1, user2 => data2 } - Mareq
我在虚拟机和主机上,使用上述代码尝试了不同的浏览器。 - koxta
2个回答

3
每次调用session[:user_id]=@user_id时,session[:user_id]都会被设置为@user_id变量的值。
尝试使用||=而不是=
使用session[:user_id] ||= @user_id来设置session[:user_id],仅在session[:user_id]未定义时将其设置为@user_id。

但是这种方式只对第一个用户设置会话,在会话未定义时。接下来的用户不会有。我错了吗? - koxta
@koxta会话存储在客户端并针对每个用户设置,因此这意味着如果用户已经有现有会话,它不会再次设置。 - hamitron

1

请参考优秀的回答koxtra,并且也要看一下devise gem来进行用户认证。

Devise会为您完成所有工作,例如用户登录、注册、创建会话和许多其他功能。您只需在Rails应用程序中安装Devise即可。


正如代码中所示,我正在尝试使用Jenkins身份验证系统进行登录,以避免实现新的机制。那么这个宝石可以适应这种情况吗?还是只适用于Rails嵌入式认证机制? - koxta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接