2011-01-21 91 views
16

我有一个使用设计进行身份验证的应用程序。 Ruby 1.9.2上的Rails 3,乘客在nginx之上。会话正在越过。 Ruby on Rails的

这是我的问题:我注意到,occaisionally我的会议越来越。当作为一个用户登录时,我有时会成为另一个用户。这真是一个可怕的问题。我设法通过使用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

我现在用的独角兽为我的应用程序。我设置了config.threadsafe!并开始独占使用活动记录会话。没有更多的memcached会话。问题没有了。至少我可以停止拉我的头发,因为安全孔被堵塞了。

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

更新4

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

+0

您使用的是不同的用户在同一个浏览器?还是只是一个完全随机的其他用户,你最近没有用过? – 2011-01-21 13:30:52

+0

未使用同一浏览器的其他用户登录。即使在不同的网络上也会发生这种情况用户A可能成为用户B.即使他们在不同的位置。它是随机发生的,唯一发现的是它们都必须登录才能发生。 – demersus 2011-01-21 15:35:01

回答

4

我愿意打赌你使用乘客的(默认)智能产卵,并成为Spawning Gotcha受害者。

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

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

1

这个bug很可能可以通过升级到rack-cache 1.2或更高版本来解决。这是可能发生的事情:

  1. 用户A请求一个页面。会话被创建并且响应中返回Set-Cookie头。
  2. 机架高速缓存错误地缓存了用户A的会话ID的Set-Cookie头。
  3. 用户B请求相同的页面,机架高速缓存服务于缓存的响应,包括Set-Cookie头和会话ID用户A.

这两张票讨论这个问题:https://github.com/rails/rails/issues/476https://github.com/rtomayko/rack-cache/pull/52

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

另请注意,即使您未使用Cookie会话存储,会话ID仍存储在Cookie中,因此即使您未使用Cookie存储,该错误仍可能会使您受到影响。

希望这会有所帮助。

约翰内斯