我一直在Rails 4.0.0中構建一些東西,我越來越奇怪的會話行爲。我有一個登錄過程爲會話寫入一個值。其缺失是怎麼判斷用戶未登錄:在Rails 4.0.0中調用`reset_session`不能在第二個後續頁面上工作
def login
session[:user_id] = user.id
#Then we render a simple page...
end
要驗證我有一個有效的用戶,我有我的application_controller.rb
一個幫手:
def current_user
logger.info "(current_user) Session ID: #{request.session[:user_id]}"
if session[:user_id] != nil && session[:user_id] != -1
User.find(session[:user_id])
end
end
helper_method :current_user
這是從幾個叫不同的地方來檢查用戶狀態並決定如何渲染頁面。 (該!= -1
下面說明)在註銷我重置會話:
def logout
reset_session
end
所呈現的視圖包括對current_user
輔助方法來呈現導航的呼叫。此頁面呈現與我的導航部分顯示爲沒有當前用戶,和調試日誌顯示會話變量清除。但是,無論我做什麼,在下一頁它都會恢復到登錄狀態,並且我突然再次對用戶進行了身份驗證,因此current_user
正在從會話中獲取正確的值。
我曾嘗試爲會話分配不同的值(例如-1),並且這具有相同的影響。出於某種原因,我的會話在被刪除後被恢復。此外,當我使用以下內容時:
def logout
reset_session
redirect_to root_path
end
索引頁面以登錄用戶身份顯示。這是令人難以置信的煩人。我很欣賞我可以使用Devise等,但這實際上是關於奇怪的會話行爲。
事情我已經嘗試:
- 與
rake tmp:sessions:clear
做實驗沒有任何影響。 - 用別的東西覆蓋會話值。
- 檢查_my_key cookie值(它永遠不會改變???) - 儘管我確實獲得了具有不同值的響應頭中返回的設置值...?這似乎有點奇怪。
- Turbo Links已被刪除。
- 使用Rails 4.0.0和Ruby 2.0.0 P247
- Chrome和Safari ...
我完全被這個難住了。哦 - 作爲最後的踢球者,如果我在瀏覽器上刪除會話cookie,寫入會話也會失敗。所以我再也找不到它了。
更新
這裏有一個登錄日誌。我在瀏覽器中刪除的cookie,並沒有代替不能夠退出,我無法登錄:
Started GET "/auth/google_oauth2/callbackstate=***************************&code=***********************************" for 127.0.0.1 at 2013-08-26 18:59:15 +0100
I, [2013-08-26T18:59:15.307731 #7441] INFO -- omniauth: (google_oauth2) Callback phase initiated.
Processing by UsersController#callback as HTML
Parameters: {"state"=>"*************************", "code"=>"****************************"}
User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."uid" = '************************' LIMIT 1
(current_user) Session ID: 1
Setting user_id in session: 1 => [1]
Account Load (2.4ms) SELECT "accounts".* FROM "accounts" WHERE "accounts"."id" = $1 ORDER BY "accounts"."id" ASC LIMIT 1 [["id", 1]]
Redirected to http://127.0.0.1:3000/pages
Completed 302 Found in 103ms (ActiveRecord: 7.3ms)
Started GET "/Pages" for 127.0.0.1 at 2013-08-26 18:59:16 +0100
Processing by PagesController#index as HTML
(current_user) Session ID:
Rendered public/401.html (1.0ms)
Filter chain halted as :is_authenticated rendered or redirected
Completed 401 Unauthorized in 11ms (Views: 10.8ms | ActiveRecord: 0.0ms)
你可以看到兩行標註(current user)
這是我的助手方法兩個電話(如上) 。我使用OmniAuth從Google OAuth獲取用戶數據,但這不是特別相關。 (AFAIK ...)
http://apidock.com/rails/ActionController/Base/reset_session –