2013-08-26 76 views
4

我一直在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 ...)

+0

http://apidock.com/rails/ActionController/Base/reset_session –

回答

2

該死的。我試圖使這個應用程序的多租戶,並已在我的session_store.rb如下:

# Be sure to restart your server when you modify this file. 
MyApp::Application.config.session_store :cookie_store, key: '_MyApp_session' 

#writes cookies across all subdomain of this site. 
Rails.application.config.session_store :cookie_store, :key => '_my_key', :domain => ENV['APP_DOMAIN'] 

顯然,這是不好的,並導致各種瘋狂的東西與你的cookie和session的情況發生。線索應該在_my_key,我認爲這是非標準的?我的猜測是我從另一個SO問題中得到了這個結果,但沒有完全意識到這個問題。

+0

你能解釋究竟是什麼問題?你的'session_store.rb'現在看起來如何? – panzi

+1

我不得不刪除啓動'Rails.application'的那一行......這導致Rails將它的cookie寫入不同的密鑰下。然後,當我重置cookie以註銷時,它失敗了。刪除此行恢復爲默認行爲並解決問題。 – xmjw

相關問題