2012-05-04 24 views
16

En mi aplicación, solo los administradores pueden crear nuevos registros de usuario. Al usuario se le envía un enlace de activación por correo electrónico donde establece su contraseña.Cómo saltear las validaciones de has_secure_password

Me gustaría utilizar el método has_secure_passord (railscast):

class User < ActiveRecord::Base 
    has_secure_password 
    ... 
end 

Funciona muy bien, pero es valida automáticamente la presencia de la contraseña de digerir ... así que cuando el administrador crea el registro las validaciones fallan. ¿Hay alguna manera de omitir solo la validación de password_digest agregada automáticamente sin saltear las otras que he agregado?

Respuesta

11

decidí hacer mi propia autenticación personalizado. La siguiente solución validará las contraseñas, pero solo cuando se establezcan. Esto permite a los administradores crear usuarios sin agregar una contraseña.

class User < ActiveRecord::Base 
    include BCrypt 

    attr_accessor :password, :password_confirmation 

    validates :password, length: (6..32), confirmation: true, if: :setting_password? 

    def password=(password) 
    @password = password 
    self.password_hash = Password.create(password) 
    end 

    def authenticate(password) 
    password.present? && password_hash.present? && Password.new(password_hash) == password 
    end 

private 

    def setting_password? 
    password || password_confirmation 
    end 

end 

Si alguien envía una respuesta que me permite seguir utilizando el método has_secure_password, voy a aceptar en su lugar.

+2

Hola solo quería decir gracias por este fragmento funcionó perfectamente para lo que necesitaba para la autenticación social –

+0

Inspirado, estoy usando una ligera variación de esto ahora para admitir múltiples inicios de sesión, permitiendo el inicio de sesión normal de correo electrónico/contraseña y sin contraseña Autenticaciones de Facebook. bauce, digo yo! – FireDragon

1

No hay manera de omitir la validación, pero sería bastante fácil escribir su propia versión del método que le permite pasar un argumento para determinar si valida o no la presencia del campo password_digest.

Simplemente extienda ActiveModel de la misma manera que lo hacen en el SecurePassword module (a través de ActiveSupport::Concern) y agregue su propio método de contraseña segura.

decir

module ActiveModel 
    module MySecurePassword 
    extend ActiveSupport::Concern 

    module ClassMethods 
     def my_has_secure_password(validate_password_digest=true) 
     # you custom logic 
     end 
    end 
    end 
end 
+0

que podría funcionar. Sin embargo, se siente un poco mal. Espero encontrar algo más elegante. – tybro0103

26

Desde las versiones 4.X de rieles, has_secure_password tiene una opción: validaciones. Si lo configura en false, no ejecutará validaciones.

La versión 3.X de la gema no es compatible con este parámetro. Sin embargo, puede respaldar el modelo activo/lib/active_model/secure_password.rb de latest 4.0.XRC code que admite este argumento.

Así que con eso, su código se verá así:

class User < ActiveRecord::Base 
    has_secure_password :validations => false 
    ... 
end 
Cuestiones relacionadas