DefaultPasswordHasher генерирует разные хэши для одного и того же значения

У меня есть пароль, хранящийся в database хэшированный с DefaultPasswordHasher при add действия.

У меня есть другое действие для изменения пароля для пользователя loggedin, в этой форме у меня есть поле с именем current_password которое мне нужно сравнить с текущим значением пароля из database .

Проблема в том, что DefaultPasswordHasher генерирует другой хеш для каждого раза, когда я хэширую значение формы, поэтому это никогда не будет соответствовать хешу из базы данных.

Следуйте за кодом подтверждения поля current_password:

  ->add('current_password', 'custom', [ 'rule' => function($value, $context){ $user = $this->get($context['data']['id']); if ($user) { echo $user->password; // Current password value hashed from database echo '<br>'; echo $value; //foo echo '<br>'; echo (new DefaultPasswordHasher)->hash($value); // Here is displaying a different hash each time that I post the form // Here will never match =[ if ($user->password == (new DefaultPasswordHasher)->hash($value)) { return true; } } return false; }, 'message' => 'Você não confirmou a sua senha atual corretamente' ]) 

Так работает bcrypt. Bcrypt – более сильный алгоритм хэширования паролей, который будет генерировать разные хэши для одного и того же значения в зависимости от текущей энтропии системы, но это может сравниться, если исходная строка может быть хеширована уже хэшированным паролем.

Чтобы решить вашу проблему, используйте функцию check() вместо функции hash() :

  ->add('current_password', 'custom', [ 'rule' => function($value, $context){ $user = $this->get($context['data']['id']); if ($user) { if ((new DefaultPasswordHasher)->check($value, $user->password)) { return true; } } return false; }, 'message' => 'Você não confirmou a sua senha atual corretamente'