2011-01-06 4 views
6

Мне нужно сделать недействительным (или ударом) сеанс пользователя. приложение ограничивает вход пользователя только одним пользователем на контейнер.Invalidate spring security session

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

, но SessionContextHolder у этого пользователя, который был ногами, по-прежнему. поэтому они по-прежнему имеют равные права доступа к защищенной странице.

Как аннулировать или удалить Принципала SessionContextHolder из указанной информации реестра сеанса?

ps: В моем старом приложении я предоставляю одну переменную в UserDomain (UserDetails), которые содержат HttpSession. и когда им нужно выгнать пользователя, я просто аннулирую HttpSession из указанного UserDomain. но я не знаю, как это сделать весной (его больше похоже на удаление Principal SessionContextHolder, чем HttpSession). реализация практически не отличается от того, как SpringRigistryImpl делает весной.

ответ

10

Вы можете, как рассмотреть Spring Security Concurrency Control. Вы можете настроить это, чтобы ограничить количество одновременных сеансов на пользователя и истечь (ударить) существующие сеансы, если это число превышено.

Spring Security Session Management

Это фрагмент нашей конфигурации (Spring 3):

<http> 
    ... 
    <session-management> 
     <concurrency-control max-sessions="1"/> 
    </session-management> 
    ... 
</http> 
7

Я предполагаю, что это способ сделать это:

SecurityContextHolder.getContext().setAuthentication(null) 

От SecurityContext.setAuthentication(Authentication) Javadocs:

Изменения в настоящее время аутентификацией принципала, или удаляет информацию аутентификации.

Параметры: аутентификации
- новый маркер аутентификации, или нуль, если нет дополнительной информации аутентификации должны храниться

+0

Этот ответ верен, а также недействителен веб-сеанс. –

+1

привет брайан, я думаю, что ваш ответ только аннулирует (или удаляет) 'SecurityContextHolder' текущего сеанса сеанса логирования. мне нужно удалить «SecurityContextHolder» другого сеанса пользователя. можем ли мы это сделать на sping? –

+0

это не для других пользователей – z0mb1ek

0

Это извлекается из приложения-security.xml

class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy" 
     p:maximumSessions="1" <br> 
        **p:exceptionIfMaximumExceeded="true"** > 
     <constructor-arg name="sessionRegistry" ref="sessionRegistry" /> 

попробуйте добавить строку в жирным шрифтом после максимального количества сеансов

6

Вы также можете сделать следующее, чтобы очистить сессию SpringSecurity:

SecurityContextHolder.clearContext()