У меня есть пароль, хранящийся в 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'