2013-05-02 6 views
5

Ich frage mich, wie Sie eine benutzerdefinierte Authentifizierungsstrategie mit dem Gerät unter Verwendung devise :token_authenticable implementieren.Benutzerdefinierte Authentifizierungsstrategie für die Verwendung von: token_authenticable

Ich habe bereits Anweisungen gefunden, wie man es mit einem Modell unter Verwendung devise :database_authenticatable macht, das here abgedeckt wird.

Das Modell, das versucht, sich zu authentifizieren, heißt Pupil. So, hier ist meine aktuelle Strategie (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 

Und in meinem config/initializers/devise.rb (versuchte es auch ohne :scope => :pupil):

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

So soll dies der Benutzer führt nicht in der Lage beeing Login, aber irgendwie wird diese Strategie nicht angewendet, wenn von devise :database_authenticatable zu devise :token_authenticable gewechselt wird.

Vielleicht fehlt mir gerade das richtige :scope hier.

Jetzt ist das Merkwürdige: Wenn ein Benutzer ein ungültiges Token eingibt, wird meine Strategie aufgerufen und "SIE WERDEN NICHT ÜBERTRAGEN!" ist zurück gekommen. Wenn jedoch das korrekte Token bereitgestellt wird, kann sich der Benutzer problemlos anmelden.

+0

Schade, dass niemand war abl e, um Ihnen dabei zu helfen. Konnten Sie eine Lösung finden? – seanhussey

+0

vielleicht http://kyan.com/blog/2013/10/11/devise-authentication-strategien helfen? –

+0

Sie müssen ein 'gültig?' Methode für Ihre Strategie. Ich weiß nicht, ob das irgendetwas löst, aber es ist sicher eine Voraussetzung für jede Strategie (siehe zum Beispiel John Beynons Link). – conciliator

Antwort

0

Ihre Strategie wurde nicht aufgerufen, weil Sie die gültigen überschreiben müssen? Methode wie this Antwort vorschlagen;

Aber auch sollten Sie die Standardstrategien Methode verwenden, aber so, wie es beabsichtigt war, verwendet werden soll, eine andere, lassen Sie die 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 

sehen, wie Sie die Methode sehen soll eine Reihe von Strategien erhalten , nicht nur der Umfang, unshift mit einem cleveren Hack ist, dass Ihre Strategien an der Spitze des Haufens setzt, aber aus irgendeinem Grund ein unerwartetes Verhalten aufweist, wenn mit mehreren benutzerdefinierten Strategien

Hoffnung arbeiten hilft

Verwandte Themen