2014-09-05 113 views
0

我正在使用Devise-1.5.4和Rails 3.0.20。這裏是我知道的事實:Rails應用程序使用session_id和remember_user_token與Devise的區別

  1. 有一個session_id的cookie與瀏覽器,這有助於一個正常的應用程序唯一跟蹤會話。可能有也可能沒有用戶登錄。
  2. 如果用戶已登錄(並且假設他選擇了remember_me),那麼在瀏覽器中還有另一個用於remember_user_token的Cookie。
  3. 在我的應用程序中,我使用(設計提供的)方法,如current_user,authenticate_user!來驗證用戶。
  4. 上述方法調用authenticate!,它自己調用serialize_from_cookie,它使用remember_token來驗證用戶。

我對使用session_id有點困惑。

  1. 什麼時候用過,怎麼用?
  2. 如果用戶登錄,我的Rails應用程序(或設計)來唯一標識用戶,它會使用session_id嗎?
  3. 當用戶不選擇remember_me(並且沒有remember_token)時會發生什麼?設計如何驗證current_user?

回答

4

會話cookie,顧名思義,是適用於當前瀏覽器會話只,也就是說,如果瀏覽器退出並重新打開(除非你做類似的恢復會話在這種情況下,瀏覽器恢復它不可來自上屆會議的cookies)。

記住cookie用於將登錄期限延長到當前會話之外。

設計使用監獄長和它的工作方式是:

1)設計註冊多種策略監獄長 - 即:從記得令牌等
2)當會話密鑰基於身份驗證,從PARAMS AUTH,AUTH 3)如果任何一種策略成功地驗證了請求,那麼管理員設置「用戶」(你通過後面的current_user輔助方法獲得)並停止運行後續策略。4)如果沒有任何一個策略該策略成功聲明沒有用戶當前登錄(並且current_user將返回零)

所以在你的情況下,如果session_id被設置(即,密鑰warden.user.user.key被設置爲有效的用戶ID)基於會話的認證策略成功並且用戶被認爲已登錄。如果該會話不可用,那麼監管人員轉向下一個策略,並且隨後到達「來自remember_token的策略」的策略。該策略檢查是否存在記憶cookie。如果存在,從該cookie獲取該令牌,驗證它是否仍然有效且未過期。如果是,則設置「用戶」,並且用戶被認爲已登錄。 如果令牌再次過期,則用戶被認爲未登錄。

如果在登錄用戶時未選擇remember_me,則記憶令牌爲沒有在記憶cookie中設置。在這種情況下,如果用戶關閉瀏覽器並再次打開它(不恢復以前的會話),則用戶不再登錄到您的系統。

通過守望者文檔和守護代碼的閱讀將有助於理解整個流程。您可以在warden代碼中放入調試打印/日誌行,並運行您的應用程序以瞭解所有這些工作是如何工作的。

+0

感謝您的精心解答。很有幫助。肯定會通過'warden'的代碼來探索。 – 2014-09-05 14:17:49

相關問題