При реализации своей админки в проекте Symfony, возникла ситуация, когда пользователь с ролью ROLE_ADMIN убирал эту роль у себя самого. При этом он имел доступ ко всем защищенным этой ролью ресурсам до следующей "реальной" аутентификации. Иными словами, информация о ролях этого пользователя бралась из сессии и была устаревшей.
Как оказалось, поправить данную ситуацию в Symfony, очень просто. Для этого необходимо, чтобы сущность пользователя реализовывала интерфейс:
Symfony\Component\Security\Core\User\EquatableInterface;
Этот интерфейс описывает всего один метод: isEqualTo. Реализация этого метода такая:
public function isEqualTo(UserInterface $user) {
if ($user instanceof UserEntity) {
// Check that the roles are the same, in any order
$isEqual = count($this->getRoles()) == count($user->getRoles());
if ($isEqual) {
foreach($this->getRoles() as $role) {
$isEqual = $isEqual && in_array($role, $user->getRoles());
}
}
return $isEqual;
}
return false;
}
Удачи!
Комментариев нет:
Отправить комментарий