Что происходит в функции аутентификации Ruby on Rails - PullRequest
0 голосов
/ 11 октября 2018

Я глубже погрузился в функцию аутентификации рельсов

На самом деле реализация кажется очень простой, но должно произойти больше магии.Я надеюсь, что кто-то может объяснить следующие результаты ...

BCrypt::Password.new('$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q') == 'test1234567'
=> true

BCrypt::Password.new('$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q')
=> "$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q"

"$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q" == 'test1234567'
=> false

Пароль в первом утверждении правильный.Похоже, что он оценивает BCrypt :: Password.new на хешированном пароле и сравнивает его с заданной строкой.

Чтобы проверить это, я оценил BCrypt :: Passowrd.new во втором выражении изатем сравнил правильный пароль в третьем утверждении.Это возвращает ложь ... Я попытался избежать косой черты, но тот же результат.

Сомоне, пожалуйста, объясните, что здесь происходит?

Вот ссылка на использование аутентификации.https://apidock.com/rails/ActiveModel/SecurePassword/InstanceMethodsOnActivation/authenticate

1 Ответ

0 голосов
/ 11 октября 2018

Давайте разберем это утверждение по утверждению.

Ваш первый оператор в порядке, он инициализирует объект BCrypt::Password и сравнивает его со строкой.BCrypt::Password реализует оператор сравнения , который проверяет объект, в данном случае строку, на предмет временного BCrypt::Password объекта.

Во втором своем утверждении вы, как и первое утверждение,инициализирует объект BCrypt::Password, но не сохраняет его в переменной, и объект остается без ссылки и не используется.Результатом оператора является просто IRB, возвращающий результат .inspect для объекта.

Наконец, третье утверждение выглядит так, как будто вы сравниваете две неравные строки, а не какой-либо объект BCrypt::Password.

Чтобы ваше второе и третье утверждение работали вместе, вам нужно сделать следующее:

# Updated second statement
password = BCrypt::Password.new('$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q')
=> "$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q"

# Updated third statement
password == 'test1234567'
=> true

Вы можете фактически позвонить .inspect на password самостоятельно, и вы увидите результат, аналогичный тому, чтоIRB вернулся для второго оператора.

password.inspect
=> "\"$2a$10$Pgxl1C8Ceg5WN5FJyP4OOOI/SiRZ0oujvWEWdNg95xp2qcPn6aP2q\""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...