Можно ли сделать недействительным весенний сеанс безопасности? - PullRequest
8 голосов
/ 12 декабря 2011

Я использую Tomcat 6.0.32, Spring Security 3.0.5

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

Ответы [ 4 ]

12 голосов
/ 13 декабря 2011

Обычно вы не можете сделать недействительными пользовательские сессии, сразу же изменив информацию об их учетной записи, не прибегая к API, специфичному для контейнера, поскольку единственный способ получить доступ к HttpSession - через объект HttpServletRequest.

Вместо этого вы можете кэшировать имя пользователя в хранилище в памяти и обращаться к нему либо в фильтре, либо в пользовательском AccessDecisionVoter. Использование флага в пользовательской таблице на самом деле не очень хорошая идея, поскольку этот флаг носит временный характер (он не имеет значения после перезапуска сервера) и лучше избегать снижения производительности запроса к базе данных при каждом запросе.

В блоге есть статья об использовании пользовательских избирателей для такого рода вещей. Это устарело, но общий подход обоснован.

Другой подход заключается в использовании SessionRegistry Spring Security, который является частью функции управления сеансами. Обычно это используется для ограничения количества сеансов, которые может иметь пользователь, но также может использоваться для перечисления аутентифицированных в настоящее время пользователей или для отметки их сеанса по истечении срока действия.

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

6 голосов
/ 13 декабря 2011

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

http://static.springsource.org/spring-security/site/docs/3.1.x/reference/session-mgmt.html#list-authenticated-principals

2 голосов
/ 13 декабря 2011

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

  1. Добавьте поле метки времени в свою таблицу пользователей(или эквивалентный), который обновляется при изменении пользователя prvis.

  2. Напишите фильтр сервлета, который проверяет, аутентифицирован ли текущий сеанс И Временная метка для пользователя в БД большевремя создания сеанса.Если это так, аннулируйте сеанс и перенаправьте куда-нибудь.

Этот фильтр должен появиться после фильтра Spring Security.

Если приложение не запущено на нескольких серверах,Вы можете использовать SessionRegistry.

0 голосов
/ 12 декабря 2011

Объект HTTPSession имеет недействительный метод.Когда пользователь меняет некоторые разрешения, вам нужно вызвать этот метод, чтобы сделать недействительными и перезагрузить их для текущего сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...