2010-02-09 4 views
5

Eine Anwendung I hat die folgende Aktion geerbt ein Benutzerprofil für die Aktualisierung:Wie schreibe und teste ich Passwortänderungen bei Verwendung von Authlogic?

class UsersController < ApplicationController 
    # ... 
    def update 
    @user = current_user 
    if @user.update_attributes(params[:user]) 
     flash[:notice] = "Successfully updated profile." 
     redirect_to root_url 
    else 
     flash[:error] = "Hrm, something went wrong." 
     render :action => 'edit' 
    end 
    end 
end 

Die Form, dass PUT s (wirklich POST s mit einem _method=PUT) zu dieser Aktion ein password und password_confirmation Feld hat, aber kein old_password Feld . Ich habe durch Tests festgestellt, dass ich nicht einmal das Feld password_confirmation ausfüllen muss.

Erste Frage: Gibt es eine etabliertere Möglichkeit, eine Passwortänderung bei der Verwendung von Authlogic vorzunehmen?

Zweite Frage: Gibt es Literatur zu Best Practices (vor allem aus Usability-Sicht) über Passwort-Änderungen? Sollte es ein separates Formular sein, das nicht mit anderen Benutzerfeldern gemischt ist?

Dritte Frage: Die meisten Sites haben ein old_password Feld, aber Authlogic scheint das nativ nicht zu unterstützen. Was ist die Authlogic-ey Weise zu bestätigen, dass es tatsächlich der Benutzer selbst ist, der das Kennwort ändert, anstatt jemand, der ihre Sitzung gehackt hat?

+0

Der Grund, warum ich Probleme hatte, das Kennwort zum Aktualisieren zu bekommen, war, dass ich '' {usus = Factory (: user), UserSession.create (@user)} 'in einem allgemeinen Setup-Block, dann' {@user = Factory (: user)}} erneut in einem inneren Setup-Block und überprüfen Sie die Passwortänderung für diesen Benutzer, aber tatsächlich ändern Sie es auf der äußeren. Oh! –

Antwort

5

Erste Antwort: Authlogic gibt Ihnen das Framework, aber die Implementierung liegt bei Ihnen. Die meisten Websites bieten lediglich eine Seite zum Ändern des Passworts, die nur die Felder "password" und "password_confirmation" oder eine Seite "edit profile" anzeigt, mit der Sie die Felder aktualisieren können, die im Datensatz des Benutzers geändert werden sollen. Abhängig davon, wie viele Felder in Ihrem Benutzerdatensatz enthalten sind, können Sie sich für eine separate Seite zum Ändern des Kennworts entscheiden. Sie möchten, dass die Formulare kurz sind.

Was password_confirmation nicht erforderlich ist:

  • Für die Prüfung hängt es davon ab, wie Sie es verspotten oder was Sie testen ... ist es der Controller/Formulare oder das Modell, das Sie testen ?
  • Ist require_password_confirmation true? (Das ist die Standardeinstellung)

Zweite Antwort: Sie werden viele Usability-Standards finden da draußen, aber ich einfach mit KISS gehen. Von einem Usability-Standpunkt aus gesehen, sind die meisten Menschen damit vertraut, was funktioniert und was etabliert ist - also checken Sie Google, Facebook und 37signals aus. Sehr einfacher Prozess. Wie oben erwähnt, sind Kurzformen ein wichtiges Usability-Ziel.

Wenn Sie über Sicherheitsanforderungen sprechen, ist Ihre beste Wette PCI Compliance [PDF], die mehrere Regeln für die Übertragung und Speicherung von Finanzdatensätzen enthält, obwohl sie keine Benutzeranmeldeinformationen enthalten. Wenn Sie dieselben Regeln auf Konten angewendet haben wie Kreditkarten, haben Sie eine wirklich sichere Einrichtung. Da die PCI-Compliance nicht zufriedenstellend funktioniert, sind Banken eine weitere gute Ressource, die man sich ansehen sollte, da schlechtes Session-Handling zu viel fehlendem Geld führen kann. Einige meiner Bankkonten bestätigen jetzt meine Logins und Passwortänderungen mit Bildern und Sicherheitsfragen oberhalb meines Standardpassworts. Ich fand auch several good articles covering that.

Was führt zu der dritten Frage ...

Dritte Antwort: In AuthLogic, einfach den "altes Kennwort" Feld des Benutzers überprüfen, bevor mit dem Update in Ihrem users_controller fortfahren: @user.valid_password?("old pass")

Wie so:

attr_accessor :old_password Ihre Benutzern Modell hinzufügen

Und Ihre Benutzer-Controller ändern:

def update 
    @user = current_user 
    if @user.valid_password?(params[:user][:old_password]) 
     if @user.update_attributes(params[:user].reject{|key, value| key == "old_password"}) 
     flash[:notice] = 'Successfully updated profile.' 
     redirect_back_or_default root_url 
     else 
     render :action => 'edit' 
     end 
    else 
     flash[:warning] = 'Your old password is WRONG! What is your malfunction!?!' 
     render :action => 'edit' 
    end 
    end 

(Sie können die Warnung ändern ...)

Verwandte Themen