Странная проблема с разработкой valid_password?
В течение последних 2 часов я пытаюсь отладить странную проблему в разработке, которая не позволяет мне войти в систему.
Вот что я имею в виду:
password
=> 'vinodsobale'
password == 'vinodsobale'
=> true
resource.valid_password?(password)
=> false
resource.valid_password?('vinodsobale')
=> true
Прикрепление скриншота:
Примечание. Я включил отладчик внутри устройства, поэтому приведенный выше код разрабатывает внутренний код.
Мне кажется, что это проблема в Devise.secure_compare
.
Ответы
Ответ 1
Эта проблема связана с известной ошибкой строковой коррупции в Ruby 2.2.0, которая была исправлена в 2.2.2.
Как описано в отчете об ошибке , коррупция произошла, когда BCrypt вызвал конкретный API-интерфейс создания строки из своего расширения C, которое Devise v3.3.0, вызванный вызовом ::BCrypt::Engine.hash_secret
из метода Devise::Models::DatabaseAuthenticatable#valid_password?
. Обходной метод для этой ошибки был опубликован в версии 3.5.0.
Решение состоит в следующем:
- Понизить Ruby на
< 2.2.0
или обновить до >= 2.2.2
;
- Обновите Devise до
>= 3.5.0
.
Ответ 2
Как насчет
resource.valid_password?(password.to_s)
Надеюсь, это поможет вам.
Ответ 3
Devise DatabaseAuthenticatable#valid_password?
использует метод под названием Encryptor::compare
он принимает 2 объекта, текущий сохраненный пароль и новый пароль, который вы хотите сравнить, я считаю, что для этого метода существует побочный эффект, который модифицирует второй параметр в посредине, так что он изменит объект вместо того, как он будет дважды изменен, что приведет к ложному результату, поэтому он может работать, если вы передали дублированный объект пароля.
вы можете использовать valid_password? password.dup
Ответ 4
Это может быть проблема с кодировкой исходного источника и вашей консоли. Если вы запустите password.codepoints
, вы сможете увидеть фактическую кодировку. Выполнение .codepoints
в строке необработанного пароля должно возвращать [112, 97, 115, 115, 119, 111, 114, 100]
.