Новое в Symfony 4.3: Устаревшие классы Role и SwitchUserRole

Давняя цель 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();
}