2010-02-09 15 views
5

Una aplicación que heredé tiene la siguiente acción para actualizar el perfil de un usuario:¿Cómo escribo y pruebo los cambios de contraseña cuando uso 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 

La forma que PUT s (realmente POST s con un _method=PUT) hasta que la acción tiene un campo password y password_confirmation, pero ningún campo old_password . Me di cuenta a través de las pruebas que ni siquiera tengo que completar el campo password_confirmation.

Primera pregunta: ¿hay una manera más establecida de hacer un cambio de contraseña cuando se utiliza Authlogic?

Segunda pregunta: ¿hay literatura sobre mejores prácticas (especialmente desde el punto de vista de la usabilidad) sobre cambios de contraseña? ¿Debería ser un formulario separado, no mezclado con otros campos de usuario?

Tercera pregunta: la mayoría de los sitios tienen un campo old_password, pero Authlogic no parece ser compatible de forma nativa. ¿Cuál es la manera Authlogic-ey de confirmar que, en realidad, el usuario mismo está cambiando la contraseña en lugar de alguien que ha pirateado su sesión?

+0

La razón por la que tuve problemas para obtener la contraseña para actualizar es que estaba haciendo '{@user = Factory (: user), UserSession.create (@user))} 'en un bloque de configuración general, luego haciendo' {@user = Factory (: user)} 'de nuevo en un bloque de configuración interno y comprobando el cambio de contraseña en ese usuario, pero realmente cambiándolo en el externo. D'oh! –

Respuesta

5

Primera respuesta: Authlogic le proporciona el marco pero la implementación depende de usted. La mayoría de los sitios simplemente proporcionan una página de "cambio de contraseña" que muestra solo los campos 'contraseña' y 'confirmación de contraseña' o una página de '' editar perfil '' que le permite ACTUALIZAR los campos que desea modificar en el registro del usuario. Según la cantidad de campos en su registro de usuario, puede optar por una página de cambio de contraseña por separado. Usted quiere que los formularios sean cortos. No se requiere

En cuanto a password_confirmation:

  • Para las pruebas, que depende de cómo se burlan de ella o lo que está probando ... ¿Es el controlador/formularios o el modelo que se está probando ?
  • ¿Es require_password_confirmation true? (Que es el valor predeterminado)

Segunda respuesta: Usted encontrará muchos estándares de usabilidad por ahí, pero simplemente ir con KISS. Desde el punto de vista de la usabilidad, la mayoría de las personas se siente cómoda con lo que funciona y lo que está establecido, así que revise Google, Facebook y 37signals. Proceso muy simple Como se mencionó anteriormente, las formas cortas son un objetivo importante de usabilidad.

Si habla de requisitos de seguridad, su mejor opción es PCI Compliance [PDF], que establece varias reglas para la transmisión y el almacenamiento de registros financieros, aunque no mencionan las credenciales del usuario. Si aplicó las mismas reglas a las cuentas que las tarjetas de crédito, tendrá una configuración realmente segura. Dado que el cumplimiento de PCI no se ha cumplido, los bancos son otro gran recurso a tener en cuenta ya que un manejo de sesión deficiente podría generar una gran pérdida de dinero. Varias de mis cuentas bancarias ahora confirman mis inicios de sesión y cambios de contraseña con imágenes y preguntas de seguridad sobre mi contraseña estándar. Encontré several good articles covering that también.

Lo que lleva a la tercera pregunta ...

Tercera respuesta: En AuthLogic, simplemente marque el campo "contraseña antigua" del usuario antes de proceder con la actualización en su users_controller con: @user.valid_password?("old pass")

así:

Añadir attr_accessor :old_password a su modelo usuarios

y cambiar su controlador de los usuarios:

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 

(es posible que desee cambiar la advertencia ...)

Cuestiones relacionadas