Контроль доступа Symfony Security не реагирует на изменения пользователя в БД

Мой пользовательский провайдер установлен на объект пользователя.

Сущность имеет модель getRoles() и работает правильно.

Моя проблема в том, что:

  • На сайте есть две роли пользователей (Администратор и Обычный)
  • Обычный пользователь не может получить доступ к созданию объекта (значение контроль доступа позволяет делать это только администраторам)
  • Пользователь входит в систему, пока у него все еще есть роль «Обычный».
  • Я иду и редактирую этого пользователя «Обычный» в БД и устанавливаю для него «Администратор».
  • Пользователь все еще вошел в систему, access_control по-прежнему рассматривает его как «Обычный».
  • $this->getUser()->getRoles() имеет роль «Администратор».
  • Пользователь по-прежнему не может получить доступ к маршруту создания объекта, поскольку access_control предполагает, что он все еще «Обычный».
  • Он должен повторно войти в систему, и только тогда контроль доступа позволяет ему получить доступ к маршруту создания Объекта.

Как мне сделать так, чтобы эти изменения базы данных применялись к сеансу без выхода из системы?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что этот вопрос похож на ваш. Принятый ответ был:

$user = $this->getUser();
$user->addRole('ROLE_ADMIN');
$this->get('fos_user.user_manager')->updateUser($user);
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->get('security.context')->setToken($token);

Эй, да, кажется, мне нужно сохранить изменение через код, а не через базу данных. Между прочим, я читал, что могу включать сложные элементы управления доступом с помощью выражений, так что я почитаю об этом подробнее.

tomJO 01.03.2019 10:33
Ответ принят как подходящий

Я пошел с голосующими Symfony: https://symfony.com/doc/current/security/voters.html

Не удалось достичь этого без ролей безопасности без выхода из системы.

Другие вопросы по теме