2010-02-01 9 views
5

Agregué una función de restablecimiento de contraseña a mi aplicación de Rails que usa Authlogic. Estaba siguiendo la guía aquí: http://www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/ y todo funciona como me gustaría excepto por una cosa: el formulario de restablecimiento de contraseña acepta contraseñas en blanco y simplemente no las cambia.Validación de fuerza de contraseñas en blanco en Authlogic

He estado buscando y he aprendido que este es el comportamiento predeterminado previsto porque le permite hacer formularios de edición de usuario que solo cambian la contraseña del usuario si ingresan una nueva e ignorarla de lo contrario. Pero en este caso, específicamente quiero aplicar la validación de la contraseña, como cuando un usuario se registra inicialmente. He encontrado dos posibles soluciones para este problema, pero no he podido averiguar cómo implementar ninguno de ellos.

1) Alguien hizo esta misma pregunta en Google Groups: respuesta

User model saves with blank password

de Ben era utilizar @user.validate_password = true para forzar la validación de la contraseña. Intenté esto pero obtengo un error de método indefinido: undefined method 'validate_password_field=' for #<User>.

2) Parece que hay una opción de configuración Authlogic llamada ignore_blank_passwords. Está documentado aquí:

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

Esto parece que podría funcionar, pero mi opinión es que se trata de una opción de configuración global que utiliza en su acts_as_authentic llamada inicial en el modelo de usuario, y no hacer quiero cambiarlo en toda la aplicación, ya que tengo un formulario de edición regular para los usuarios donde quiero que las contraseñas en blanco sean ignoradas por defecto.

¿Alguien ha encontrado una solución a esto? Veo validate_password= en el registro de cambios de Authlogic 1.4.1 y no se ha eliminado nada desde entonces. ¿Simplemente lo estoy usando incorrectamente? ¿Hay alguna manera de usar ignore_blank_passwords por solicitud?

Respuesta

5

Esto lo que hice.

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 

Ahora en su controlador, establezca el atributo ignore_blank_passwords a falso.

user.ignore_blank_passwords = false 

Aquí está trabajando dentro de los límites de AuthLogic. No tiene que cambiar la lógica de validación.

1

¿Quizás pruebe el valor del parámetro en el controlador? (Código de aire):

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

Además de la solución de Zetetic que podría hacerlo de esta manera:

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 

Básicamente, se está comprobando si authlogic cambió el registro de usuario (que no lo hace si la contraseña esta vacio). En el bloque else, puede verificar si la contraseña está en blanco y agregar un mensaje de error apropiado al registro del usuario o mostrar un mensaje flash.

8

Esto es un tipo de un hilo viejo, pero dado que no está respondido lo publicaré.

He logrado hacerlo un poco más limpio que las otras soluciones, "ayudando" a las validaciones autólogas con las mías.

he añadido esto a usuario:

class User < ActiveRecord::Base 

    ... 

    attr_writer :password_required 

    validates_presence_of :password, :if => :password_required? 

    def password_required? 
    @password_required 
    end 

    ... 
end 

se puede reducir a dos líneas al hacer una attr_accessor y el uso de :if => :password_required (sin interrogatorio), pero prefiero esta otra sintaxis con el signo de interrogación.

A continuación, el controlador de la acción se puede hacer así:

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 

Esto tendrá un efecto local; el resto de la aplicación no se verá afectada (a menos que password_required se establezca en verdadero en otros lugares, eso es).

Espero que ayude.

+0

Pude utilizar el atributo 'ignore_blank_paswords'. Mira mi respuesta para más detalles. –

2
User.ignore_blank_passwords = false 

Utilice modelo, no objeto para establecer esta propiedad.

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

¿Eso no lo cambiaría para todo el modelo? Solo quiero ignorar las contraseñas en blanco en una sola acción. –

Cuestiones relacionadas