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 вам необходимо реализовать новые интерфейсы, если вы используете эти методы.