Rails会话重叠

时间:2017-01-31 08:30:52

标签: ruby-on-rails ruby

我有一个Rails应用程序,它将会话信息存储在数据库中,用户信息存储在“用户”表中,其中“id”作为主键,并且自动增加。

登录后,用户可以转到“产品”页面,其中显示按ID过滤的产品:

@products = Rails.cache.fetch("user-products-" + session[:id].to_s, {:expires_in => 30.minutes}) do
Product.where(:user_id => session[:id])
end

发生了令人困惑的事情:有时用户可以看到其他用户的产品,显然是随意的。我已经检查过产品表中的用户ID大约10次了,根本就没有意义。我存储在memcache中的其他内容也是如此,例如用户名和姓,地址,设置......

这种情况随机发生,并不一致。可能是在有大量流量时(用户报告在高峰时段发生这种情况)。

在我的config / application.rb中:

config.cache_store = :dalli_store, "memcached.mydomain.com", { :namespace => "Frontend", :pool_size => 10 }

在config / initializers / session_store.rb

Rails.application.config.session_store :active_record_store, key: '_ssbl_session', :expire_after => 7.days

我使用Ruby 2.3.1,Rails 4.2.5,Dalli gem v 2.7.6 with connection_pool 2.2.1和activerecord-session_store 0.1.2,Apache 2.4.6,Passenger 5.0.26,memcached 1.4.15 on CentOS 7。

我尝试过的事情:

  1. 最初我使用的是其他memcache商店的宝石,问题仍然存在,更改为Dalli,问题仍然存在(这是否试图告诉我这不是与Rails或任何宝石有关的东西?);
  2. 不同的会话到期 - 尝试1到15天;
  3. 清除memcache数据;
  4. 清算会议表;
  5. 更改命名空间;
  6. 我也刚开始固定会话IP(当存储在memcache中的last_ip与当前IP不同时强制退出),我想我 会看到这是怎么回事......但即使这个问题仍然存在 用户将退出而不是看到其他用户的购买, 他们会抱怨被踢出去...... 2周后,这仍然会发生,没有用户被踢出局。这就像会话的某些部分被其他会话的数据覆盖。
  7. 我也意识到了其他的事情:由于会话的长度(7-15天,我能说什么,用户体验改进......),我的会话表最终会有40K记录,但不幸的是我不是'如果甚至可以在40K哈希值内进行md5碰撞,那么它的灵感就足以检查重复了......
  8. 我也开始将每个匹配记录到一个表中,其中包含session_id,user.id和IP地址......将查看此数据是否有用。
  9. 我已经检查了答案:Users take sessions of other users when sessions are stored in memcached (Rails)。添加该代码时,我得到500.

    任何帮助都将不胜感激。

    稍后编辑:

    我在用户登录后设置会话[:id]:

    def process_login
       ...
       # at this point I have authenticated the user by e-mail and pwd and have the object in the "user" var
       session[:id] = user.id
       ...
    end
    

    编辑3月10日: 我不再将任何会话数据存储到memcache中。我从问题中删除了“dalli”和“memcache”标签。问题依然存在。我仍然无法重现这一点,但我可以看到它是真实的,因为受此问题影响的会话日志包含对他们无法访问的控制器的命中。

0 个答案:

没有答案