2013-05-02 36 views
5

我在想如何使用devise :token_authenticable設計實現自定義身份驗證策略。用於設計的自定義身份驗證策略使用:token_authenticable

我已經找到了關於如何使用devise :database_authenticatable的模型來做到這一點的說明,它覆蓋了here

im試圖驗證的模型名爲Pupil。 所以這是我目前的策略(位於config/initializers/custom_auth.rb):

Warden::Strategies.add(:auth_pupil_strategy) do 
    # missing valid? method indicates this strategy is always applied 

    def authenticate! 
    fail!("YOU SHALL NOT PASS!") 
    end 
end 

在我config/initializers/devise.rb(也試了一下沒有:scope => :pupil):

config.warden do |manager| 
    manager.default_strategies(:scope => :pupil).unshift :auth_pupil_strategy 
end 

所以這應該會導致用戶不beeing能夠登錄,但不知何故,當從devise :database_authenticatable切換到devise :token_authenticable時,此策略不適用。

也許我只是在這裏錯過了正確的:scope

現在,這裏是奇怪的事情:每當用戶輸入一個無效的標記,我的策略被調用,並且「你不應該通過!」返回。 但是,當提供正確的標記時,用戶可以很好地登錄。

+0

恥辱,沒有人ABL e幫助你解決這個問題。你能找到解決方案嗎? – seanhussey 2013-09-16 15:05:13

+0

也許http://kyan.com/blog/2013/10/11/devise-authentication-strategies會有幫助嗎? – 2013-10-11 16:05:29

+0

你必須實施'有效?'你的策略的方法也是如此。我不知道這是否會解決任何問題,但它肯定是任何策略的先決條件(請參閱John Beynon的鏈接)。 – conciliator 2014-01-28 20:40:33

回答

0

您的策略沒有被調用,因爲您需要重寫有效的?方法如this答案建議;

而且你應該使用默認的策略方法,但是它的目的是要使用的方式是另一種,讓看到declaration

def default_strategies(*strategies) 
    opts = Hash === strategies.last ? strategies.pop : {} 
    hash = self[:default_strategies] 
    scope = opts[:scope] || :_all 

    hash[scope] = strategies.flatten unless strategies.empty? 
    hash[scope] || hash[:_all] || [] 
end 

,你可以看到該方法被認爲收到了一系列戰略決定,不只是適用範圍,使用不印字是一個聰明的黑客工具,使你的策略在堆的頂部,但由於某種原因,有意外的行爲時,正在與多個自定義策略

希望幫助