2012-08-17 12 views
6

Voglio creare una strategia di autenticazione personalizzata per accedere all'API. Ho seguito il codice di esempio allo Devise ignoring custom strategy.Devise ignora la mia strategia personalizzata

Il problema è che il valido? il metodo nella mia strategia Api non viene mai eseguito (basato sul tentativo di fare leva in esso).

Il mio codice:

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 

e nel inizializzatore devise:

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

cosa io faccia, sembra che Devise usa sempre la sua strategia di default. Per quanto ne so, questo dovrebbe essere sufficiente ...

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

Richiedo la strategia come questa in cima alla mia disposizione testamentaria inizializzatore:

So che la strategia viene caricata al momento dell'avvio poiché se inserisco una chiamata di richiamo all'interno della classe, inizierà una sessione di leva. Ma le chiamate di Pry all'interno dei metodi non vengono mai eseguite. : -S

risposta

4

Trovato la risposta!

Ho dovuto usare questo:

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

per farlo funzionare. Stranamente, gran parte del codice di esempio che ho visto in rete non la usava: -S

0

Quando si richiede la strategia personalizzata? Confrontando l'esempio, stai aggiungendo la strategia lì invece che nel tuo inizializzatore. Potresti provare a richiedere la strategia personalizzata nella parte superiore dell'inizializzatore per assicurarti che venga caricata prima di aggiungerla a default_strategies.

Se questo non risolve il problema, non abbiate paura di aggiungere alcune istruzioni di inserimento temporaneo proprio nel progettare se stesso dove viene chiamato l'autenticazione per verificare le opzioni_predefinite. Cioè, se non sei già sicuro di usare il debugger, che è quello che farei.

+0

Ho questa riga nella parte superiore dell'inizializzatore di inizializzazione: richiede Rails.root.join ('app/idea/strategie/api ') e se aggiungo una chiamata di richiamo all'interno della strategia, questa viene caricata all'avvio dell'applicazione rails. MA tutte le chiamate di leva che ho dentro il valido? il metodo non viene mai chiamato. – Alain