tutorial rails español desde cero ruby-on-rails devise ruby-on-rails-3.2

ruby-on-rails - desde - ruby on rails tutorial español



Problema extraño con idear contraseña válida? (4)

Diseñar DatabaseAuthenticatable#valid_password? está utilizando un método llamado Encryptor::compare , toma 2 objetos, la contraseña almacenada actual y la nueva contraseña que desea comparar, creo que hay un efecto secundario para este método que modifica el segundo parámetro en el medio para que se modifique el objeto en lugar de una vez se modificará dos veces, lo que conduce a un resultado falso, por lo que puede funcionar si pasa un objeto duplicado de contraseña. ¿Puedes intentar usar valid_password? password.dup valid_password? password.dup

Durante las últimas 2 horas, he estado tratando de depurar un problema extraño en el diseño que no me permite iniciar sesión.

Aquí está lo que me refiero también:

password => ''vinodsobale'' password == ''vinodsobale'' => true resource.valid_password?(password) => false resource.valid_password?(''vinodsobale'') => true

Adjuntando la captura de pantalla también:

Nota: He habilitado el depurador dentro del dispositivo, por lo que el código anterior es el código interno del dispositivo.

Para mí, parece un problema en Devise.secure_compare .


Este problema se debe a un error conocido de corrupción de cadenas en Ruby 2.2.0 que se fixed en 2.2.2.

Como se describe en el informe de error , la corrupción se produjo cuando BCrypt llamó a una API de creación de cadenas específica desde su extensión C, que Devise v3.3.0 activó al llamar a ::BCrypt::Engine.hash_secret desde Devise::Models::DatabaseAuthenticatable#valid_password? método. Se publicó una workaround específica para este error en v3.5.0.

La solución es:

  • Baje la categoría de Ruby a < 2.2.0 , o actualice a >= 2.2.2 ;
  • Actualizar dispositivo a >= 3.5.0 .

Podría ser un problema con la codificación entre la fuente original y su consola. Si ejecuta password.codepoints , debería poder ver la codificación real. La ejecución de .codepoints en la cadena de ''contraseña'' sin .codepoints debería devolver [112, 97, 115, 115, 119, 111, 114, 100] .


Qué tal si

resource.valid_password?(password.to_s)

Espero que te ayude.