2011-01-11 8 views
2

Jungs. Ich habe ein Problem bei der Authentifizierungsprüfung. Ich habe das magische "aktive" Feld im Benutzermodell, sagen wir, wenn aktiv ist falsch, wenn Login mit korrektem Passwort, wird es die Nachricht wie "Sie sind suspendiert, bitte kontaktieren Sie Ihre Verwaltung" (ich definierte diese Nachricht in I18n Datei); Wenn Sie sich mit einem falschen Passwort anmelden, wird die Meldung "not_active" sowie die Meldung "password_invalid" wie "password invalid" angezeigt. Ich denke, das liegt daran, dass authlogic die Validierung sowohl für das "aktive" Feld als auch für das Passwort durchgeführt hat und es scheint, dass die Passwort-Validierung an erster Stelle steht.Authlogic Validierung Bestellung

Meine Frage ist, wie kann die Kennwortüberprüfung umgehen, wenn ‚aktiv‘ falsch ist. Oder kann ich nur eine nicht aktive Nachricht anzeigen? mein Code wie:

if @user_session.save 
    redirect_to home_path 
else 
    render :json => {:success => false, :error => @user_session.errors.full_messages.join("\n")} 
end 
+0

Ich denke, Sie sollten zuerst nach Passwort und dann nach aktiv suchen. –

+0

@Joy: Aber ich möchte die Passwort-Validierung umgehen, wenn aktiv ist falsch. Ich möchte nur die not_active Nachricht anzeigen, wenn der Benutzer inaktiv ist, ohne die password_invalid Nachricht egal richtig oder falsches Passwort Benutzer eingegeben. –

Antwort

1

OK, so gefällt das ich nicht als Benutzer-Erfahrung, aber wenn Sie wirklich, wie etwas wollen, tun:

before_filter :restrict_inactive_users, :on=>:create 

def restrict_inactive_users 
    @user = User.find_by_login(params[:user_session][:login]) rescue nil 
    return unless @user 
    unless @user.active? 
    flash[:error] = "You are suspended, please contact your administration" 
    render :action=>:new 
    return false 
    end 
end 

def create 
    @user_session = UserSession.new(params[:user_session]) 
    if @user_session.save 
    redirect_to home_path 
    else 
    render :json => {:success => false, :error => @user_session.errors.full_messages.join("\n")} 
    end 
end 
+0

Danke Jesse, diese Lösung ist einfach zu verstehen :) –

0

Heute dachte ich eine Lösung aus was die Passwort-Überprüfung nicht umgeht, sondern einfach die Passwort-Fehlermeldung von user_session löscht. Code wie:

if @user_session.save 
    redirect_to home_path 
else 
    @user_session.errors.delete(:password) unless @user_session.attempted_record.active 
    render :json => {:success => false, :error => @user_session.errors.full_messages.join("\n")} 
end 
0

Beginnen Sie mit dem Abrufen des Benutzers mit der Kennung Ihrer Wahl, wie die E-Mail oder Benutzername. Wenn der Benutzer nicht aktiv ist, können Sie die anderen Fehler entfernen, bevor Sie zur Anmeldeseite zurückkehren.

 @user_session.errors.clear 

Dann werden die Fehler nicht angezeigt, wenn die Seite neu gerendert wird. Sie müssen jedoch eine benutzerdefinierte Fehlermeldung angeben, z. B. über die flash.now[:error] oder Ihre JSON-Antwort.