Новое в Symfony 4.4: Перенос паролей

В 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);
    }
}

Прочтите документы об этой новой функции, чтобы узнать, как ее реализовать при использовании пользовательского поставщика или пользовательского кодировщика паролей.