2012-08-17 88 views
6

我想創建一個自定義auth策略來訪問API。我遵循Devise ignoring custom strategy的示例代碼。設計忽略我的自定義策略

問題是,有效的?我的Api策略中的方法永遠不會運行(基於嘗試撬動它)。

我的代碼:

module Devise 
    module Strategies 
    class Api < Devise::Strategies::Base 
     def valid? 
     binding.pry 
     params[:request_source] == 'api' 
     end 

     def authenticate! 
     #do stuff here 

     if user 
      success!(user) 
     else 
      warden.custom_failure! 
      render :json=> {:success=>false, :message=>"Error with your login or password"}, :status=>401 
     end 
     end 
    end 

    Warden::Strategies.add(:api, Devise::Strategies::Api) 

    end 
end 

,並在色器件初始化:

config.warden do |manager| 
    manager.default_strategies.unshift :api 
end 

我做什麼都,好像總是設計使用其默認的策略。據我所知,這應該是足夠了...

------- --------編輯

我需要這樣的戰略在我色器件初始化的頂部:

require Rails.root.join('app/devise/strategies/api') 

我知道這個策略是在啓動時加載的,因爲如果我在類中放置了一個pry調用,它將啓動一個pry會話。但這些方法中的Pry調用永遠不會運行。 :-S

回答

4

找到答案!

我不得不用這樣的:

config.warden do |manager| 
    manager.default_strategies(scope: :user).unshift :api 
end 

,使其工作。奇怪的是,我在網上看到的很多示例代碼沒有使用它:-S

0

你什麼時候需要自定義策略?與示例相比,您將在那裏添加策略,而不是在初始化程序中。您可能會嘗試在初始化程序的頂部請求自定義策略,以確保在將其添加到default_strategies之前將其加載。

如果這樣做不成問題,不要害怕在設計本身時添加一些臨時置入語句,其中調用驗證來檢查default_strategies。也就是說,如果你還沒有使用調試器進行舒適的話,我會這麼做。

+0

我在設計初始化程序的頂部有這條線:require Rails.root.join('app/devise /策略/ api'),如果我在策略中添加一個pry調用,它會在rails應用程序啓動時加載。但所有撬電話,我有有效的內部?方法永遠不會被調用。 – Alain 2012-08-22 15:34:38