barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

вторник, 9 октября 2012 г.

Spring Security: сброс сессии определенного пользователя

Чтобы сбросить сессию определенного пользователя, во-первых, нужно получить доступ к реестру сессий. Как это делается, я уже писал в прошлом посте. В конфигурации Spring Security отличие состоит лишь в том, что нам понадобится не только пометить определенную сессию как более не действительную, а ещё и разлогинить пользователя с недействительной сессией (само это не сделается). Для последнего нужен специальный фильтр, тот же, что используется для контроля множественного входа:
<http ...>    
<custom-filter before="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
...
</http>
<!-- Создаем фильтр,ссылающий на реестр сессий. Задаем страницу,
  -- на которую будет выкидывать разлогиненого пользователя
  -->
<beans:bean id="concurrencyFilter"
class="org.springframework.security.web.session.ConcurrentSessionFilter">
<beans:property name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="expiredUrl" value="/login.jsp?invalidSessionError=1" />
 </beans:bean>
Всё, теперь пользователь с недействительной сессией будет выкидываться на  "/login.jsp?invalidSessionError=1", можно разлогинивать:
ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
SessionRegistry sReg = (SessionRegistry) ac.getBean("sessionRegistry");
for(Object principal: sReg.getAllPrincipals())
{
UserDetails authentication = (UserDetails)principal;
if(authentication.getUsername().equals(username))
{
List<SessionInformation> userSessions = sReg.getAllSessions(principal, false);// получаем все сессии пользователя, кроме истекших
for(SessionInformation sessInfo: userSessions)
sessInfo.expireNow();
}
}
Этот код разлогинит пользователя, имя которого задано переменной username. Написанное выше верно для случая, когда принципал представлен объектом UserDetails. 

Комментариев нет:

Отправить комментарий