Можно ли аннулировать весеннюю сессию безопасности?
Я использую Tomcat 6.0.32, Spring Security 3.0.5
В моем веб-приложении некоторые пользователи могут изменять права других пользователей. Когда это произойдет, я хотел бы аннулировать любой сеанс для пользователя, чьи привилегии были изменены. Возможно ли это, и если да, то как?
4 ответа:
Обычно вы не можете аннулировать сеанс(ы) пользователя сразу же после изменения его учетной записи, не прибегая к определенному контейнеру API, поскольку единственный способ получить доступ к
HttpSession
- это через объектHttpServletRequest
.Вместо этого вы можете кэшировать имя пользователя в хранилище в памяти и сверяться с ним либо в фильтре, либо в пользовательском
AccessDecisionVoter
. Использование флага в пользовательской таблице не очень хорошая идея, так как флаг является временным по своей природе (он не имеет значения после перезагрузки сервера), и лучше использовать его в качестве избегайте снижения производительности запроса базы данных при каждом запросе.Есть статья в блоге об использовании пользовательских избирателей для такого рода вещей. Это устарело, но общий подход является здравым.
Другой подход заключается в использовании функции Spring SecuritySessionRegistry
, которая является частью функциональности управления сеансами. Обычно это используется для ограничения количества сеансов, которые может иметь пользователь, но также может использоваться для перечисления в настоящее время аутентифицированных пользователей или пометки их сеанса для истечение.Также можно было бы просто перезагрузить привилегии пользователя, вместо того чтобы полностью выходить из системы.
Я считаю, что это то, что вам нужно - получить список зарегистрированных пользователей и аннулировать сеансы тех, кто вам не нужен.
Предполагая, что вы запускаете приложение на нескольких серверах, Вам понадобится способ, чтобы это произошло на всех серверах.
Добавьте в пользовательскую таблицу (или ее эквивалент) поле timestamp, которое обновляется при изменении prvis пользователя.
Напишите фильтр сервлета, который проверяет, аутентифицирован ли текущий сеанс, и метка времени для пользователя в БД больше, чем время создания сеанса. Если это так, отмените сеанс и перенаправьте где-то.
Этот фильтр должен появиться после фильтра безопасности Spring.
Если вы не запускаете приложение на нескольких серверах, вы можете использовать SessionRegistry.