2011-01-21 151 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存儲,該錯誤仍可能會使您受到影響。

希望這會有所幫助。

約翰內斯