2010-02-09 16 views
5

Aplikacja odziedziczyłem posiada następujące działania w celu aktualizacji profilu użytkownika:Jak pisać i testować zmiany hasła podczas korzystania z 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 

Formularz że PUT s (naprawdę POST s z _method=PUT) do tego działania ma pole password i password_confirmation, ale nie old_password pola . Zauważyłem podczas testów, że nie muszę wypełniać pola password_confirmation.

Pierwsze pytanie: czy istnieje lepszy sposób na zmianę hasła podczas korzystania z Authlogica?

Drugie pytanie: czy istnieje literatura na temat najlepszych praktyk (zwłaszcza z punktu widzenia użyteczności) dotyczących zmian w hasłach? Czy powinien to być osobny formularz, nie mieszany z innymi polami użytkownika?

Pytanie trzecie: Większość witryn ma pole old_password, ale Authlogic nie wydaje się tego wspierać. Jaki jest sposób Authlogic-ey potwierdzający fakt, że to on sam zmienia hasło zamiast kogoś, kto zhackował swoją sesję?

+0

Przyczyną problemów z uzyskaniem hasła do aktualizacji jest to, że robiłem "{@user = Factory (: użytkownik), UserSession.create (@user)} w ogólnym bloku konfiguracji, a następnie ponownie wykonaj operację '{@user = Factory (: użytkownik)} w wewnętrznym bloku konfiguracji i sprawdź zmianę hasła tego użytkownika, ale faktycznie zmieniając go na zewnętrznym. D'oh! –

Odpowiedz

5

Pierwsza odpowiedź: Authlogic zapewnia ramy, ale wdrożenie należy do Ciebie. Większość witryn zapewnia jedynie stronę "zmień hasło", która pokazuje tylko pola "hasło" i "hasło_konta" lub stronę "profilu edycji", która umożliwia aktualizację pól, które chcesz zmienić w rekordzie użytkownika. W zależności od tego, ile pól znajduje się w rekordzie użytkownika, możesz wybrać osobną stronę zmiany hasła. Chcesz, aby formularze były krótkie.

chodzi o password_confirmation nie są wymagane:

  • Do testowania, to zależy od tego, jak wyśmiewać go lub co testujemy ... czy to sterownik/formularze lub model, który testujesz ?
  • Czy require_password_confirmation true? (Który jest domyślny)

Druga odpowiedź: Znajdziecie wiele standardów użytecznością tam, ale ja po prostu iść z KISS. Z punktu widzenia użyteczności większość ludzi jest zadowolona z tego, co działa i co zostało ustalone - więc sprawdź Google, Facebook i 37signals. Bardzo prosty proces. Jak wspomniano powyżej, krótkie formularze są ważnym celem użyteczności.

Jeśli mówisz o wymogach bezpieczeństwa, najlepiej postawić na PCI Compliance [PDF], który określa kilka zasad dotyczących przesyłania i przechowywania zapisów finansowych, chociaż nie mają one wzmianki o poświadczeniach użytkownika. Jeśli zastosujesz te same zasady do kont, co karty kredytowe, będziesz miał naprawdę bezpieczną konfigurację. Ponieważ PCI Compliance nie nadąża za dostarczeniem, banki są kolejnym świetnym źródłem informacji, ponieważ zła obsługa sesji może doprowadzić do wielu brakujących pieniędzy. Kilka moich kont bankowych potwierdziło teraz moje logowanie i zmiany haseł z obrazami i pytaniami bezpieczeństwa powyżej mojego standardowego hasła. Znalazłem także several good articles covering that.

Co prowadzi do trzeciego pytania ...

Trzecia odpowiedź: W Authlogic, po prostu sprawdzić „stare hasło” pole użytkownika przed przystąpieniem do aktualizacji w users_controller z: @user.valid_password?("old pass")

tak:

Dodaj attr_accessor :old_password do modelu użytkowników

I zmienić swój kontroler użytkowników do:

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 

(możesz zmienić ostrzeżenie ...)