2015-01-16 5 views
2

Я написал систему, в которой фоновый PHP-процесс (написанный с использованием RabbitMQBundle) обрабатывает сообщения из очереди сообщений. Рабочий процесс обновляет учетные записи пользователей. Это может включать изменение в роли пользователя.Недействительный сеанс для определенного пользователя в Symfony2

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

Вопрос: Как можно обновить сеанс для конкретного пользователя новыми ролями? Или когда это невозможно, как сеанс может быть недействительным?

Обратите внимание, что в фоновом процессе у нас нет активных security.context или request, которые мы можем использовать. Код, как это, следовательно, не работает:

$this->get('security.context')->setToken(null); 
$this->get('request')->getSession()->invalidate(); 

ответ

2

Вы можете решить эту проблему несколькими способами:

1) через security.always_authenticate_before_granting

Вы можете заставить Symfony обновить пользователя на каждом запросе, эффективно перегрузочные все роли с ним.

Смотрите этот SO вопрос/ответ: Change the role of a distant user without having to relog

2) Via EquatableInterface:

Вам нужно осуществить isEqualsTo(User) в свою очередь, должен сравнить все с User класса, в том числе ролей.

Смотрите эту ссылку: Create a User Class

3) Наконец, вы можете использовать DBMS для хранения сессий. Тогда просто найти запись и удалить ее.

+0

Спасибо! Я посмотрю на влияние производительности первого варианта. Любая идея, можно ли сделать вариант 3 с Memcache или Redis в качестве хранилища сеансов? – Xatoo

+0

Я пока не использовал ни одного из них, но, зная возможности каждого из них, я бы сказал, что это полностью выполнимо;) Что касается №1, я использовал эту опцию в проекте с ~ 100 пользователями, и я не заметил любое воздействие. Это имеет смысл, поскольку 100 пользователей довольно низки ... –

Смежные вопросы