Можно ли аннулировать весеннюю сессию безопасности?


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

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

4 8

4 ответа:

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

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

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

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

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

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

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

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

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

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

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

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

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