В Symfony 4.3 представили встроенный кодировщик паролей для хеширования ваших пользовательских паролей с использованием наилучшего алгоритма, доступного на вашем сервере:
# config/packages/security.yaml
security:
# ...
encoders:
App\Entity\User:
algorithm: auto
cost: 14
Этот алгоритм выбирается автоматически и может изменяться со временем, поэтому разные пользователи будут использовать разные алгоритмы. Технически это не проблема, потому что Symfony знает, как хэшировать и сравнивать каждый пароль, поэтому все пользователи смогут войти в систему. Однако было бы здорово, если бы все пользователи всегда использовали наилучший алгоритм.
В Symfony 4.4, когда пользователь успешно проходит аутентификацию, Symfony проверяет, доступен ли лучший алгоритм хеширования, и создаст новый хеш пароля при помощи лучшего алгоритма, чтобы вы могли сохранить обновленный хеш. На практике при использовании провайдера сущностного пользователя вам нужно только обновить репозиторий Doctrine, связанный с пользователями, и реализовать Symfony\Component\Security\Core\User\PasswordUpgraderInterface
.
Этот интерфейс определяет единственный метод с именем upgradePassword()
, который Symfony будет вызывать, когда пароль пользователя должен быть перефразирован:
// src/Repository/UserRepository.php
namespace App\Repository;
// ...
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
class UserRepository extends EntityRepository implements PasswordUpgraderInterface
{
// ...
public function upgradePassword(UserInterface $user, string $newEncodedPassword): void
{
// this code is only an example; the exact code will depend on
// your own application needs
$user->setPassword($newEncodedPassword);
$this->getEntityManager()->flush($user);
}
}
Прочтите документы об этой новой функции, чтобы узнать, как ее реализовать при использовании пользовательского поставщика или пользовательского кодировщика паролей.