Я написал систему, в которой фоновый PHP-процесс (написанный с использованием RabbitMQBundle ) обрабатывает сообщения из очереди сообщений. Рабочий процесс обновляет учетные записи пользователей. Это может включать изменение в роли пользователя.
Проблема в том, что пользователь не заметит изменений в своих ролях во время входа в систему. Новые роли будут применяться только после выхода из системы и снова. С точки зрения безопасности это нежелательно. Пользователь должен потерять любую роль, как только администратор удалит права этого пользователя в бэкэнд-системе.
Возникает вопрос: как можно обновить сеанс для конкретного пользователя новыми ролями? Или, когда это невозможно, как сеанс может быть недействительным?
Обратите внимание, что в фоновом процессе у нас нет активного security.context
или request
который мы можем использовать. Код, подобный этому, поэтому не работает:
$this->get('security.context')->setToken(null); $this->get('request')->getSession()->invalidate();
Вы можете решить это несколькими способами:
1) через security.always_authenticate_before_granting
Вы можете заставить Symfony
обновить пользователя по каждому запросу, эффективно перезагружая все роли.
См. Этот вопрос / вопрос: измените роль удаленного пользователя без необходимости переучивать
2) Через EquatableInterface
:
Вам необходимо реализовать isEqualsTo(User)
который, в свою очередь, должен сравнивать все с классом User
, включая роли.
См. Эту ссылку: Создать пользовательский класс
3) Наконец, вы можете использовать DBMS
для хранения сеансов. Тогда просто найти запись и удалить ее.