2014-02-14 91 views
16

我想了解在使用rails/devise登錄用戶時發生了什麼。rails/devise如何處理cookie會話?

我創建了一個極小的rails應用程序,安裝了devise並創建了User devise模型。 一切工作正常,當我登錄(使用remember me)我得到一個會話cookie正如預期。

現在搞什麼的是:rails如何處理瀏覽器通過cookie傳遞的會話信息?

我天真地期望一些信息存儲在數據庫中,但我不知道在哪裏。沒有session表格,Users中沒有會話列,我在tmp目錄中找不到任何感興趣的內容。

請注意,重新啓動服務器不會終止我的會話。這當然是可以預料的,但現在我真的很想知道這裏發生了什麼樣的魔法?

換句話說:服務器如何檢查cookie的有效性以認證用戶?

謝謝!

+1

Devise在數據庫中存儲了一些信息('last_sign_in_at','last_sign_in_ip'等),但依靠cookies來模擬超時狀態會話一致性。該cookie具有「TTL」或生存時間,並且在檢查「記住我」時將該cookie寫入瀏覽器。 (根據我的理解,這至少是默認/最典型的系統,相對於設計) – mecampbellsoup

回答

11

默認的rails會話存儲是CookieStore。這意味着所有會話數據都存儲在cookie中,而不是存儲在任何地方的數據庫中。在Rails 3.2中,cookie被簽名以防止被篡改,但沒有加密。在Rails 4中,它通常是默認加密的。它在Cookie中的事實是它在整個服務器重啓過程中如何持續存在。這也意味着你只能存儲4k的數據,並且你不想在Rails中存儲任何敏感的東西。< 4.最好在會話中保留最少的數據。

您也可以選擇將會話數據存儲在數據庫中,並且只在Cookie中擁有會話標識。

這個答案我給一週有一些額外的信息,可能是有用的:

Sessions made sense to me before I started reading about them online

此外,對於的CookieStore軌道API文檔給出了一個很好的總結:

http://api.rubyonrails.org/classes/ActionDispatch/Session/CookieStore.html

+0

我認爲,當你說「它是如何在重啓服務器時持續存在的」,你的意思是「它是如何持續存在的重新啓動瀏覽器/客戶端「...? – mecampbellsoup

+0

我的確意味着重啓服務器,因爲問題是:「請注意,重啓服務器不會終止會話,當然可以,但現在我真的很想知道這裏發生了什麼樣的魔術?」,所以我的觀點是它在服務器重啓過程中持續存在的原因是它存儲在客戶端的cookie中,因此獨立於服務器重啓。當然,它也可以在瀏覽器重新啓動時持續存在,具體取決於cookie到期時間。 – Tim

+0

所以,如果我在軌道4,我的應用程序是後端服務器獨立?其會話親和力是否可用? – simo