会议越过了。 Ruby on Rails

时间:2011-01-21 03:18:23

标签: ruby ruby-on-rails-3 session devise

我有一个使用设计进行身份验证的应用。在红宝石1.9.2上的Rails 3,乘客在nginx之上。

这是我的问题:我已经注意到,我的会话偶尔会越过。在以一个用户身份登录时,我有时会成为另一个用户。这真是一个可怕的问题。我已经设法通过使用active_record会话存储来停止它。但我对它可能发生的地方感到难过。它在使用cookie存储和memcached存储时都会发生。我不知道从哪里开始调试。我已经完成了所有代码,而且我只是从'current_user'读取而不是写作。我没有任何代码存储会话中的项目。

任何人都可以向我提出有关在何处或如何发生这种情况的建议?

更新

我在页面顶部设置了一个div来转储每个请求的会话内容。它不仅仅是用户切换,而是整个会话。我在会话中设置了一些虚拟变量,只是为了看看会发生什么。当会话越过时(用户A变为用户B)用户A现在看到用户B具有的虚拟变量。用户B已注销。

更新2

我在堆栈溢出中发现了另一个问题,它描述了同样的问题:In Rails, what could cause a user to have another user's session?

看起来它可能是一个乘客问题?但更重要的是,它怎么会发生呢?这是一个 REAL 大问题。我该如何制止这个?

更新3

我现在正在使用Unicorn来提供我的应用程序。我设置了config.threadsafe!并开始专门使用活动记录会话。没有更多的memcached会话。问题消失了。至少我可以停止拔头发,因为安全孔堵了。

我仍然想知道究竟是什么导致了它。大多数教程都展示了如何使用默认的产卵方法来设置乘客。当然,我认为memcached在会话管理方面优于其他方法。特别是在多应用服务器环境中。

更新4

好的,上次和最后更新。这是使用相同memcached连接的分叉进程的问题。我通过使用dalli memcached客户端修复它,并重置了独角兽或乘客的after_fork回调中的连接。

2 个答案:

答案 0 :(得分:4)

我愿意打赌你正在使用Passenger(默认)智能产卵,并成为Spawning Gotcha的牺牲品。

将您的PassengerSpawnMethod设置为'保守',看看是否会消失。这很容易解释memcache的情况,除非你正在防范它。大概是设计(或你的代码)中的类似问题。

您是否看到会话跨越物理服务器,或仅跨越一台服务器?

答案 1 :(得分:1)

很可能通过升级到rack-cache 1.2或更高版本来修复此错误。这可能是发生的事情:

  1. 用户A请求页面。创建会话并在响应中返回Set-Cookie标头。
  2. Rack-cache错误地使用用户A的会话ID缓存Set-Cookie标头。
  3. 用户B请求同一页面,rack-cache提供缓存响应,包括会话ID为用户A的Set-Cookie标头。
  4. 这两张门票讨论了这个问题:https://github.com/rails/rails/issues/476https://github.com/rtomayko/rack-cache/pull/52

    最后,在rack-cache 1.2的发行说明中提到了这个问题:https://github.com/rtomayko/rack-cache/blob/master/CHANGES

    另请注意,即使您没有使用cookie会话存储,会话 ID 仍然存储在cookie中,因此即使您不使用该错误,此错误仍可能会让您感到困惑饼干店。

    希望这有帮助。

    约翰