2013-04-07 3 views
32

Ich verwende ersinnen und erstellt ein Benutzerfeld genannt: aktiv, die entweder wahr oder falsch ist. Ich muss den Benutzer manuell aktivieren (true), bevor der Benutzer sich anmelden darf. Zumindest ist dies die Absicht. Ich habe schon versucht, diese ...Überprüfen Sie, ob Benutzer aktiv ist, bevor so dass Benutzer mit devise anmelden (Schienen)

class SessionsController < Devise::SessionsController 
    # POST /resource/sign_in 
    def create 
    "resource/signin CREATE" 
    self.resource = warden.authenticate!(auth_options) 
    unless resource.active? 
     sign_out 
     redirect_to :sorry_not_active_url 
     return 
    end 
    set_flash_message(:notice, :signed_in) if is_navigational_format? 
    sign_in(resource_name, resource) 
    respond_with resource, :location => after_sign_in_path_for(resource) 
    end 
end 

jedoch nicht alle Orte, verfängt, wo ein Benutzer anmelden kann, zum Beispiel, wenn ein Benutzer sein Passwort ändert, meldet die Website automatisch automatisch nach in. Wenn der Benutzer jedoch nicht aktiv ist, möchte ich nicht, dass sie sich anmelden können, sondern zu einer sorry_not_active_url weitergeleitet werden.

Was wäre der beste Weg, um den Benutzer von der Unterzeichnung in zu verhindern, wenn der Benutzer nicht aktiv ist?

Vielen Dank.

Antwort

73

diese beiden Methoden zu Ihrem Benutzermodell hinzufügen, ersinnen sollten sie automatisch abholen - Sie sollten nicht Devise::SessionsController

def active_for_authentication? 
    super && self.your_method_for_checking_active # i.e. super && self.is_active 
end 

def inactive_message 
    "Sorry, this account has been deactivated." 
end 
+0

Dieser große erstellen! Gibt es eine Möglichkeit, nach verschiedenen Zuständen zu suchen, wie aktiv, nicht aktiv, anstehend, abgelehnt, indem ein Feld mit 4 verschiedenen Werten erstellt wird und für jeden Status eine andere Nachricht ausgegeben wird? – user2012677

+1

nach dem ich darüber nachdenke, nehme ich an, ich könnte Def inactive_message ein Feld verweisen, und das Feld könnte eine benutzerdefinierte Nachricht pro Benutzer haben. Scheint das richtig? – user2012677

+0

Klingt wie es – house9

3

Devise erweitern müssen (Wenn Sie ersinnen 3.2+) unterstützen nun block Parameter in (Session)

# assuming this is your session controller 

class SessionsController < Devise::SessionsController 

def create 
    super do |resource| 
    unless resource.active? 
     sign_out 
     # you can set flash message as well. 
     redirect_to :sorry_not_active_url 
     return 
    end 
    end 
end 
+0

Hallo Viren funktionieren würde, würden Sie im Gegensatz es auf diese Weise zu tun, in der akzeptierte Antwort auf die Umsetzung ein paar Vorteile aufzulisten können? Ich möchte das jetzt selbst implementieren und frage mich, was derzeit die beste Praxis ist. Vielen Dank. – Marklar

+1

@Marklar Dies kann nützlich sein, wenn Sie mehrere Authentifizierungsstrategien unterstützen und den regulären Authentifizierungsablauf deaktivieren müssen, jedoch nicht für alle. Während der Anwendungsfall des OP ist, um zu überprüfen, ob ein Benutzer aktiv ist, musste ich die regelmäßige Sitzungsgenerierung deaktivieren, wenn ein Benutzer sich beispielsweise über eine andere Methode (OAuth) authentifiziert hat. Der modellbasierte Ansatz mit 'active_for_authentication? 'Wäre schwieriger gewesen. – sp89