В Symfony 4.3 был анонсирован native password encoder для хеширования паролей наилучшим доступым способом шифрования на вашем сервере. По сути это автоматический выбор:
# config/packages/security.yaml
security:
# ...
encoders:
App\Entity\User:
algorithm: auto
cost: 14
Этот алгоритм выбирается автоматически и может изменяться со временем, поэтому для разные пользователей будут использоваться разные алгоритмы. Технически это не проблема, потому что Symfony знает, как хэшировать и сравнивать каждый пароль, поэтому все пользователи смогут войти в систему. Однако было бы здорово, если бы все пользователи всегда использовали наилучший алгоритм.
В Symfony 4.4, когда пользователь успешно проходит аутентификацию, Symfony проверяет, доступен ли лучший алгоритм хеширования, и хеширует пароль, чтобы вы могли сохранить обновленный хеш. На практике при использовании entity user provider вам нужно только обновить репозиторий Doctrine, связанный с пользователями, и реализовать Symfony\Component\Security\Core\User\PasswordUpgraderInterface
.
Этот интерфейс определяет единственный метод с именем upgradePassword()
, который Symfony будет вызывать, когда пароль пользователя должен быть перекодирован.
<?php
// 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);
}
}
Читайте в документации об этой новой функции, чтобы узнать, как ее реализовать при использовании кастомного user provider или кастомного password encoder.
Оригинал статьи: https://symfony.com/blog/new-in-symfony-4-4-password-migrations