Новое в Symfony 5.3: Улучшения для безопасности пользователей

User переименован в InMemoryUser

В приложениях Symfony провайдер пользователей в памяти позволяет создавать пользователей (и определять их учетные данные) в файле конфигурации, который загружается в память, без использования баз данных или любой другой постоянной службы.

Хотя этот провайдер пользователей предназначен только для прототипов или очень маленьких/специальных приложений, он основан на классе с именем User (все пространство имен — Symfony\Component\Security\Core\User\User). Это смущает некоторых новичков, которые думают, что это основной класс User в безопасности Symfony.

Вот почему в Symfony 5.3 переименовали User в InMemoryUser и UserChecker в InMemoryUserChecker, чтобы лучше передать их назначение (в 5.3 старые имена все еще работают, но они устарели, а в Symfony 6.0 они будут удалены):

# config/packages/security.yaml
 security:
     password_hashers:
-        Symfony\Component\Security\Core\User\User: bcrypt
+        Symfony\Component\Security\Core\User\InMemoryUser: bcrypt

username переименован в identifier

Еще один источник путаницы, связанный с пользователями – это концепция «имени пользователя», которая используется в системе безопасности Symfony. Во многих приложениях это имя пользователя не является традиционным именем пользователя, а является адресом электронной почты или даже некоторым токеном API.

Вот почему в Symfony 5.3 решили избежать этой путаницы и переименовали «имя пользователя» в «идентификатор пользователя». Это может потребовать некоторых изменений в коде вашего приложения (в 5.3 старые имена все еще работают, но они устарели, а в Symfony 6.0 они будут удалены):

  • UserInterface::getUsername() теперь  UserInterface::getUserIdentifier()
  • loadUserByUsername() теперь loadUserByUserIdentifier(), как в загрузчиках пользователей, так и в провайдерах пользователей
  • UsernameNotFoundException теперь UserNotFoundException

Разделение паролей от пользователей

Symfony\Component\Security\Core\User\UserInterface реализован всеми пользователями безопасности в приложениях Symfony. К сожалению, этот интерфейс является продуктом своего времени и содержит некоторые методы, которые больше не используются в современных приложениях.

Первый ненужный метод — это getSalt(), который больше не нужен при использовании современных алгоритмов хеширования паролей (bcrypt, Argon2 и т. д.). Этот метод был перемещен в новый интерфейс LegacyPasswordAuthenticatedUserInterface.

Другой метод — getPassword(), который больше не нужен во многих функциях без пароля, таких как ссылки для входа. Этот метод был перемещен в новый интерфейс PasswordAuthenticatedUserInterface.

В Symfony 5.3 UserInterface по-прежнему содержит методы getPassword() и getSalt() (они будут удалены в Symfony 6.0). Однако при обновлении до Symfony 5.3 вам необходимо реализовать новые интерфейсы, если вы используете эти методы.