2012-08-17 9 views
6

Chcę utworzyć niestandardową strategię autoryzacji dostępu do interfejsu API. Postępowałem zgodnie z przykładowym kodem pod numerem Devise ignoring custom strategy.Poszukuj ignoruj ​​moją niestandardową strategię

Problem polega na tym, że ważny? metoda w mojej strategii Api nigdy nie jest uruchamiana (w oparciu o próbę podważenia jej).

Mój kod:

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 

aw inicjatora opracować:

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

Co jeszcze mogę zrobić, wydaje się Devise zawsze używać domyślnego strategię. AFAIK, to powinno wystarczyć ...

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

wymagam na samym szczycie mojej opracować strategię inicjatora takiego:

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

Wiem, że strategia jest ładowana podczas rozruchu, ponieważ jeśli podam połączenie wewnątrz klasy, rozpocznie się sesja podważania. Ale klawisze Pry wewnątrz tych metod nigdy nie działają. : -S

Odpowiedz

4

Znaleziono odpowiedź!

musiałem użyć tego:

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

aby to działało. Dziwne jest to, że większość przykładowego kodu, który widziałem w sieci, nie używała go: -S

0

Kiedy potrzebujesz niestandardowej strategii? W porównaniu do przykładu dodajesz tam strategię zamiast w inicjalizatorze. Możesz spróbować wymagać niestandardowej strategii u góry inicjalizatora, aby upewnić się, że jest załadowana zanim dodasz ją do default_strategies.

Jeśli to nie wystarczy, nie bój się dodawać tymczasowych instrukcji put w samej sobie, gdy uwierzytelnianie jest wywoływane w celu sprawdzenia domyślnych strategii. Oznacza to, że jeśli nie korzystasz już z debuggera, to właśnie ja bym zrobił.

+0

Mam tę linię u góry inicjalizatora devise: require Rails.root.join ('app/devise/strategies/api ') i jeśli dodam połączenie wewnętrzne w strategii, zostanie ono załadowane po uruchomieniu aplikacji rails. ALE wszystkie rozmowy telefoniczne, które mam, są ważne? metody nigdy nie są wywoływane. – Alain

Powiązane problemy