2013-05-02 9 views
5

Mi chiedo come implementare una strategia di autenticazione personalizzata con devise utilizzando devise :token_authenticable.Strategia di autenticazione personalizzata per Devise Utilizzo di: token_authenticable

Ho già trovato le istruzioni su come farlo con un modello utilizzando devise :database_authenticatable che è coperto here.

Il modello im che tenta di autenticare è denominato Pupil. Così qui è il mio attuale strategia (che si trova in 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 

E nella mia config/initializers/devise.rb (anche provato senza l':scope => :pupil):

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

Quindi questo dovrebbe portare ad l'utente non essendo in grado per accedere, ma in qualche modo questa strategia non viene applicata quando si passa da devise :database_authenticatable a devise :token_authenticable.

Forse mi manca solo il :scope giusto qui.

Ora, ecco la cosa strana: ogni volta che un utente inserisce un token non valido, la mia strategia viene invocata e "NON PASSA!" viene restituito. Tuttavia, quando viene fornito il token corretto, l'utente può accedere correttamente.

+0

Peccato che non c'era nessuno abl e per aiutarti con questo. Sei riuscito a trovare una soluzione? – seanhussey

+0

forse http://kyan.com/blog/2013/10/11/devise-authentication-strategies ti aiuteranno? –

+0

Devi implementare un 'valido?' metodo per la tua strategia pure. Non so se questo risolverà qualcosa, ma è sicuramente un prerequisito per qualsiasi strategia (vedi, ad esempio, il link di John Beynon). – conciliator

risposta

0

La tua strategia non è stata chiamata perché è necessario sovrascrivere il valido? metodo come suggerire risposta this;

Ma anche si dovrebbe utilizzare il metodo di strategie predefinite, ma il modo in cui era destinato ad essere utilizzato è un altro, diciamo vedere la 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 

come si può vedere il metodo dovrebbe ricevere una serie di strategie , non solo il campo di applicazione, utilizzando non innesto è un trucco intelligente che mette le vostre strategie in cima al mucchio, ma per qualche motivo ha un comportamento imprevisto quando si lavora con più strategie personalizzate

speranza aiuta

Problemi correlati