【问题标题】:Why Rails session is being shared between multiple users为什么 Rails 会话在多个用户之间共享
【发布时间】:2016-02-23 07:17:00
【问题描述】:

我正在尝试使用会话机制来存储这样记录的用户的信息: session[:user_id]=@user_id ,并且没问题。

但是当新用户登录应用时,变量 session[:user_id] 会更新为新用户 id,使第一个用户使用无效 id 执行请求。

我使用了不同的浏览器,私有浏览器,虚拟机中的一个浏览器和主机中的另一个浏览器,但仍然出现问题。

我很欣赏一些建议。在多个用户之间共享会话是否正常?还有另一种方法来存储一些特定的数据,并防止用户之间共享?我认为那个会话是独一无二的,为什么那个变量会改变? cookie 变量也是如此。

编辑:

应用程序控制器

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中

【问题讨论】:

  • 默认情况下,会话不会在多个用户(不同的浏览器、PC、...)之间共享。如果是这样,那么您的代码一定有问题。请提供您的代码、使用地点和方式session
  • 我认为您在一个浏览器中使用一个会话并且只更改用户凭据,对吧?如果是这样,您应该以某种方式存储此类特定数据,避免在这些用户之间共享,例如作为带有@user_id 键的哈希:{ user1 => data1, user2 => data2 }
  • 我在虚拟机和主机中使用不同的浏览器尝试了上面的代码。

标签: ruby-on-rails session login


【解决方案1】:

关注 koxtra 的出色回答并 还可以查看devise gem 以进行用户身份验证。

Devise 将为您完成一切,例如用户登录、注册、创建会话和更多功能。您只需安装Devise 在您的 Rails 应用程序中。

【讨论】:

  • 正如我在代码中展示的那样,我正在尝试使用jenkins身份验证系统进行登录,以避免执行新机制。那么这个gem能适应这种情况吗?还是仅适用于 Rails 嵌入身份验证机制?
【解决方案2】:

每次调用session[:user_id]=@user_id 时,会话[:user_id] 都会被设置为@user_id 变量设置的任何值。

尝试使用||= 而不是=

使用session[:user_id]||= @user_id 设置会话以仅在未定义会话[:user_id] 时将会话[:user_id] 设置为@user_id。

【讨论】:

  • 但是当会话未定义时,这种方式只会为第一个用户设置会话。下一个用户不会。我错了吗?
  • @koxta 会话存储在客户端并设置 PER 用户,所以这意味着如果用户已经有一个现有会话,它将不会再次设置它。
猜你喜欢
  • 1970-01-01
  • 2017-04-08
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2012-03-27
  • 2012-08-02
相关资源
最近更新 更多