2011-07-08 96 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的代码库非常庞大),所以总是要为文档,文章,教程,无论你能找到什么,首先。 –