validación de la fuerza de contraseñas en blanco en Authlogic
-
24-09-2019 - |
Pregunta
Estoy agregando una característica de restablecimiento de contraseña de mi aplicación Rails que utiliza Authlogic. Estaba siguiendo la guía aquí: http: // www .binarylogic.com / 2008/11/16 / tutorial-reset-contraseñas-con-authlogic / y todo funciona como me gustaría excepto por una cosa: la forma de restablecimiento de contraseña acepta contraseñas en blanco y simplemente no lo hace cambiarlos.
He estado buscando alrededor, y han aprendido que este es el comportamiento predeterminado previsto, ya que le permite hacer el usuario editar formularios que sólo cambian la contraseña del usuario si entran en una nueva, y hacer caso omiso de lo contrario. Pero en este caso, yo quiero específicamente para hacer cumplir la validación de la contraseña como cuando un usuario se registra inicialmente. He encontrado dos soluciones posibles para este problema, pero no han sido capaces de encontrar la manera de poner en práctica cualquiera de ellos.
1) Alguien hizo esta misma pregunta en Grupos de Google:
blanco ahorra con contraseña en blanco
La respuesta de Ben era utilizar @user.validate_password = true
a la validación de la fuerza de la contraseña. He intentado esto pero me da un error método no definido:. undefined method 'validate_password_field=' for #<User>
2) Parece que hay una opción de configuración llamada Authlogic ignore_blank_passwords
. Está documentado aquí:
Módulo: Authlogic :: ActsAsAuthentic :: Contraseña :: 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 llamada acts_as_authentic
inicial en el modelo del usuario, y no quiero cambiarlo de aplicaciones de todo, como yo tener un formulario de edición regular para los usuarios en el que necesito contraseñas en blanco para ser ignorado por defecto.
Cualquier persona encontró una solución a esto? Veo validate_password=
en el registro de cambios de Authlogic 1.4.1 y nada de ello han sido retirados desde entonces. Simplemente estoy usando de manera incorrecta? ¿Hay una manera de utilizar ignore_blank_passwords
sobre una base por-petición?
Solución
Esto es 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, el atributo ignore_blank_passwords
a falso.
user.ignore_blank_passwords = false
A continuación, se está trabajando dentro de los confines de AuthLogic. Usted no tiene que cambiar la lógica de validación.
Otros consejos
Esto es una especie de hilo de edad, pero ya que no se contesta voy a publicar esto.
he conseguido hacerlo un poco más limpia que las otras soluciones, "ayudar" validaciones authlogic con la mía.
I añadido este al 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 reducirla 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á afectado (a menos password_required
se establece en true en otros lugares, que es).
espero que ayude.
User.ignore_blank_passwords = false
El uso del modelo, no objeto de establecer esta propiedad.
def update_passwords
User.ignore_blank_passwords = false
if @user.update_attributes(params[:user])
...
end
User.ignore_blank_passwords = true
end
Tal vez probar 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
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 está vacía). En el bloque else se puede comprobar si la contraseña estaba en blanco y añadir un mensaje de error apropiado para el registro de usuario o muestre un mensaje flash.