2013-04-12 51 views
1

Devise身份驗證gem的經典應用程序結構是僅服務器端Rails應用程序。在這種情況下,當沒有任何東西阻止會話銷燬時。當併發請求未完成時無法註銷Devise用戶

但是我使用的是Rails + Devise + Angular.js,並嘗試以正確的方式註銷 - 這意味着 - /users/sign_out URL必須由Angular應用程序調用,而不是通過點擊<a href="https://stackoverflow.com/users/sign_out">鏈接。

我的應用程序以塊填充數據。如果在/ users/sign_out URL被調用時某些數據請求尚未完成,Devise會重新登錄該用戶。

我做了我的自定義註銷的方法來看看會發生什麼:

before_filter :authenticate_user! 

def data_request 
    ............. 
end 

def logout 
    sign_out(current_user) 
    if current_user 
    puts 'Has not signed out!' 
    else 
    puts 'Has signed out!' 
    end 
    redirect_to '/users/sign_out' 
end 

sign_out方法調用current_user真的nil,但隨後data_request第二天請求通過before_filter,如果我還沒有登陸出。

如果您能幫助我瞭解發生的情況以及如何實施可靠的註銷,我將不勝感激。

更新

我曾經遇到過一個奇怪的現象:

如果我停止WEBrick服務器,再次啓動它,並重新加載頁面,應用程序允許我這樣稱呼API方法,如會話不銷燬。據我所知,Devise的身份驗證Cookie不包含加密/編碼的登錄名和密碼,但代表臨時會話ID,只有在特定會話處於活動狀態且會話銷燬應無效時才應該有效。

回答

0

當Angular應用程序調用url時,你傳遞了什麼方法?設備默認使用delete方法註銷url.Try更改您的設備配置文件(config/initializers/devise.rb)並修改sign_out_via屬性。默認情況下它是:刪除,你只需要改成:get。

config/initializers/devise.rb 
config.sign_out_via = :get 
+0

註銷方法當前設置爲GET,但它沒有任何區別。我試過DELETE,GET,POST - 行爲總是一樣的。 – Paul