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.