Давняя цель Symfony – упростить определенные части системы безопасности. В Symfony 3.3 устарели как RoleInterface
, а в Symfony 4.1 отказались от AdvancedUserInterface
. В Symfony 4.3 пометили как устаревшие Role
и SwitchUserRole
классы.
На практике есть несколько реальных преимуществ использования объектов вместо строк для представления ролей. В конечном итоге это привело только к накладным расходам, потому что вам пришлось вызывать Role::getRole()
, чтобы получить фактическую строку, представляющую роль.
Если ваше приложение использует полнофункциональную среду Symfony, вам, вероятно, не нужно ничего менять, поскольку вы уже определяете роли с помощью необработанных строк. Если вы используете автономный компонент безопасности, вам необходимо провести рефакторинг любого кода, связанного с классами ролей (или определить свой собственный класс ролей, чтобы продолжать использовать классы).
Если вы используете переключение пользователей в своем приложении, вам необходимо провести рефакторинг любого кода, который использует SwitchUserRole
, чтобы использовать вместо него новый SwitchUserToken
:
// BEFORE
use Symfony\Component\Security\Core\Role\SwitchUserRole;
if ($this->security->isGranted('ROLE_PREVIOUS_ADMIN')) {
foreach ($this->security->getToken()->getRoles() as $role) {
if ($role instanceof SwitchUserRole) {
$impersonatorUser = $role->getSource()->getUser();
break;
}
}
}
// AFTER
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
$token = $this->security->getToken();
if ($token instanceof SwitchUserToken) {
$impersonatorUser = $token->getOriginalToken()->getUser();
}