2010-02-01 10 views
5

Ich füge meiner Rails-Anwendung, die Authlogic verwendet, eine Funktion zum Zurücksetzen des Kennworts hinzu. Ich folgte dem Leitfaden hier: http://www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/ und alles funktioniert wie ich möchte, mit einer Ausnahme: das Passwort-Reset-Formular akzeptiert leere Passwörter und ändert sie einfach nicht.Erzwinge die Validierung leerer Passwörter in Authlogic

Ich habe herumgesucht und habe gelernt, dass dies das beabsichtigte Standardverhalten ist, weil es Ihnen ermöglicht, Benutzerformulare zu erstellen, die nur das Passwort des Benutzers ändern, wenn sie ein neues eingeben und es sonst ignorieren. Aber in diesem Fall möchte ich insbesondere die Validierung des Passworts erzwingen, wie wenn ein Benutzer sich anfänglich registriert. Ich habe zwei mögliche Lösungen für dieses Problem gefunden, bin aber nicht in der Lage gewesen, herauszufinden, wie man beide implementiert.

1) Jemand fragte dieselbe Frage auf Google Groups:

User model saves with blank password

Ben Antwort @user.validate_password = true zu verwenden war die Validierung des Passworts zu erzwingen. Ich habe das versucht, aber ich bekomme einen undefinierten Methodenfehler: undefined method 'validate_password_field=' for #<User>.

2) Es scheint eine Authlogic Konfigurationsoption namens ignore_blank_passwords zu geben. Es wird hier dokumentiert:

Module: Authlogic::ActsAsAuthentic::Password::Config#ignore_blank_passwords

Das sieht aus wie es funktionieren würde, aber mein Verständnis ist, dass dies eine globale Konfigurationsoption, die Sie in Ihrem ersten acts_as_authentic Aufruf im User-Modell verwenden, und ich weiß nicht Ich möchte es anwendungsweit ändern, da ich ein normales Bearbeitungsformular für Benutzer habe, bei denen leere Kennwörter standardmäßig ignoriert werden sollen.

Wer hat eine Lösung gefunden? Ich sehe validate_password= im Änderungsprotokoll für Authlogic 1.4.1 und nichts davon wurde seitdem entfernt. Benutze ich es einfach falsch? Gibt es eine Möglichkeit, ignore_blank_passwords pro Anfrage zu verwenden?

Antwort

5

Das habe ich gemacht.

class User < ActiveRecord::Base 
    attr_accessor :ignore_blank_passwords 

    # object level attribute overrides the config level 
    # attribute 
    def ignore_blank_passwords? 
    ignore_blank_passwords.nil? ? super : (ignore_blank_passwords == true) 
    end 
end 

Jetzt in Ihrem Controller, setzen Sie das ignore_blank_passwords Attribut auf false gesetzt.

user.ignore_blank_passwords = false 

Hier arbeiten Sie innerhalb der Grenzen AuthLogic. Sie müssen die Validierungslogik nicht ändern.

1

Vielleicht testen Sie den Wert des Parameters in der Steuerung? (Luft-Code):

def update 
    @user.password = params[:user][:password] 
    @user.password_confirmation = params[:user][: password_confirmation] 
    if @user.password.blank? 
    flash[:error] = "Password cannot be blank" 
    render :action => :edit 
    return 
    end 
    if @user.save 
    flash[:notice] = "Password successfully updated" 
    redirect_to account_url 
    else 
    render :action => :edit 
    end 
end 
1

Neben zetetic Lösung Sie es auf diese Weise tun könnten:

def update 
    @user.password = params[:user][:password] 
    @user.password_confirmation = params[:user][: password_confirmation] 

    if @user.changed? && @user.save 
    flash[:notice] = "Password successfully updated" 
    redirect_to account_url 
    else 
    render :action => :edit 
    end 
end 

Sie Überprüfung im Grunde, wenn authlogic den Benutzerdatensatz geändert (was es nicht, wenn das Passwort ist leer). Im Else-Block können Sie überprüfen, ob das Passwort leer war und dem Benutzerdatensatz eine entsprechende Fehlermeldung hinzufügen oder eine Flash-Nachricht anzeigen.

8

Dies ist eine Art alter Thread, aber da es unbeantwortet ist, werde ich dies veröffentlichen.

Ich habe es geschafft, es ein bisschen sauberer als die anderen Lösungen, "helfende" authlogic Validierungen mit meinem eigenen.

Ich habe diese an Benutzer:

class User < ActiveRecord::Base 

    ... 

    attr_writer :password_required 

    validates_presence_of :password, :if => :password_required? 

    def password_required? 
    @password_required 
    end 

    ... 
end 

Sie es auf zwei Zeilen reduzieren können eine attr_accessor durch Herstellung und Verwendung :if => :password_required (keine Abfrage), aber ich ziehe diese andere Syntax mit dem Abfragezeichen.

def update 
    @user.password = params[:user][:password] 
    @user.password_confirmation = params[:user][: password_confirmation] 
    @user.password_required = true 

    if @user.save 
    flash[:notice] = "Password successfully updated" 
    redirect_to account_url 
    else 
    render :action => :edit 
    end 
end 

Diese eine lokale Wirkung haben;:

Ihre Controller-Aktion kann dann wie folgt durchgeführt werden Der Rest der Anwendung ist davon nicht betroffen (es sei denn, password_required ist an anderen Stellen auf "True" gesetzt).

Ich hoffe es hilft.

+0

Ich konnte das Attribut 'ignore_blank_paswords' verwenden. Sehen Sie sich meine Antwort für Details an. –

2
User.ignore_blank_passwords = false 

Verwenden Sie das Modell, nicht das Objekt zum Festlegen dieser Eigenschaft.

def update_passwords 
    User.ignore_blank_passwords = false 
    if @user.update_attributes(params[:user]) 
    ... 
    end 
    User.ignore_blank_passwords = true 
end 
+0

Würde das nicht für das gesamte Modell geändert? Ich möchte nur leere Passwörter in einer Aktion ignorieren. –