2012-08-17 21 views
6

Ich möchte eine benutzerdefinierte Authentifizierungsstrategie für den Zugriff auf die API erstellen. Ich folgte dem Beispielcode unter Devise ignoring custom strategy.Devise ignorieren meine benutzerdefinierte Strategie

Das Problem ist, dass die gültige? Methode in meiner Api-Strategie wird nie ausgeführt (basierend auf versuchen, in es zu hauen).

Mein Code:

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 

und in der devise initializer:

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

Was immer ich tun, scheint es wie immer seine Devise Strategie Standard verwenden. AFAIK, das sollte genug sein ...

------- -------- EDIT

ich die Strategie, wie diese erfordern an der Spitze meiner devise initializer:

Ich weiß, dass die Strategie beim Booten geladen wird, da, wenn ich einen Aufruf in die Klasse setzen, wird es eine Sitzung starten. Aber die Pry-Aufrufe innerhalb der Methoden werden nie ausgeführt. : -S

Antwort

4

Die Antwort gefunden!

Ich hatte diese verwenden:

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

es funktioniert. Sonderbare Sache ist, eine Menge des Beispielcodes, den ich im Netz sah, benutzte es nicht: -S

0

Wann benötigen Sie Ihre benutzerdefinierte Strategie? Im Vergleich zum Beispiel fügen Sie die Strategie dort statt in Ihrem Initialisierer hinzu. Sie könnten versuchen, die benutzerdefinierte Strategie oben im Initialisierer zu benötigen, um sicherzustellen, dass sie geladen ist, bevor Sie sie zu default_strategies hinzufügen.

Wenn das nicht den Trick macht, haben Sie keine Angst, einige temporäre puts-Anweisungen direkt in device selbst hinzuzufügen, wo authenticate aufgerufen wird, um default_strategies zu überprüfen. Das heißt, wenn Sie nicht schon bequem den Debugger verwenden, was ich tun würde.

+0

Ich habe diese Linie an der Spitze des Geräteinitialisierers: erfordern Rails.root.join ('app/devise/strategies/api ') und wenn ich innerhalb der Strategie einen Aufruf hinzufüge, wird dieser geladen, wenn die Rails-App gestartet wird. ABER alle Pry Calls, die ich innerhalb des gültigen habe? Methode wird nie aufgerufen. – Alain

Verwandte Themen