2011-07-08 131 views
6

對於使用:token_authenticatable設計用戶模型,像這樣如何銷燬會話(「註銷」)與令牌身份驗證的用戶

class Voter < ActiveRecord::Base 
    devise :token_authenticatable 
end 

曾經有一個路線叫destroy_user_session,這樣你就可以註銷用戶通過鏈接到destroy_user_session_path。這在最近的版本中似乎已經改變 - 現在只有:database_authenticatable爲我創建了一條銷燬路線。

因此,對於使用令牌認證的用戶,實施「註銷」/「註銷」操作以結束其會話的正確方法是什麼?

回答

5

By default,當您通過令牌登錄時,Devise會將用戶存儲在會話中,就像在數據庫身份驗證策略中一樣。

您可以通過在設計初始設置stateless_tokentrue禁用此:

Devise.setup do |config| 
    config.stateless_token = true 
end 

這種方式,令牌必須提供每個請求


據我所知,令牌認證被設計爲與數據庫認證一起使用。 devise_for只會在您的型號爲database_authenticatable時添加會話路由。這對Devise來說似乎是一個小小的疏漏,但在我看來,離開用戶進入session的令牌對我來說並沒有多大意義。

無論如何,請嘗試手動定義到Devise會話的路由。

Devise's routing helpers(未測試的代碼)改編:

as :user do # User scope 
    resource :session, :controller => 'devise/sessions' do 
    # new_user_session | GET /users/sign_in => devise/sessions#new 
    get :new, :path => 'sign_in', :as => "new" 

    # user_session | POST /users/sign_in => devise/sessions#create 
    post :create, :path => 'sign_in' 

    # destroy_user_session | GET /users/sign_out => devise/sessions#destroy 
    get :destroy, :path => 'sign_out', :as => "destroy" 
    end 
end 

在任何情況下,the documentation for the devise_for helper指定哪些路由創建和它們指向什麼。

+0

嘿馬泰斯,感謝您的指針。我想我實際上喜歡存儲用戶會話,而不是隨每個請求一起攜帶令牌。我的問題更多的是,如果我不*使用無狀態令牌認證,我如何在最後登錄用戶? IOW,我該如何結束Devise爲我存儲的會話? –

+0

你是怎麼學習這些東西的?你讀過RDocs,還是隻是直接找到源代碼? –

+1

@Jo,更新了答案。我在爲自己的項目配置Devise時瞭解了無狀態令牌。我總是先閱讀文檔。當文檔沒有我想知道的內容,或者當我需要了解事情的工作方式時,我只會去源代碼。 (當我需要回答諸如此類的問題時,這很有幫助!:P)雖然理解內部運作是有幫助的,但並不總是可行或現實的(例如,Rails的代碼庫非常龐大),所以總是要爲文檔,文章,教程,無論你能找到什麼,首先。 –