2014-02-14 2 views
7

Я создаю приложение grails с плагином 1.2.7.3 с пружинной защитой, а также с пружинной защитой -ui 0.2 и хотел бы получить список ВСЕХ пользователей, которые в настоящее время вошли в систему (т. е. имеют текущий активный сеанс). Пользователи могут войти в систему либо через контроллер входа (daoAuthenticationProvider), либо автоматически через файл cookie rememberMe. Я реализовал ниже код, используя ConcurrentSessionControlStrategy создать sessionRegistry:Как получить список всех зарегистрированных пользователей (в том числе куки memme) в grails с пружинной безопасностью

в /conf/spring/resources.groovy:

import org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy 
import org.springframework.security.web.session.ConcurrentSessionFilter 
import org.springframework.security.core.session.SessionRegistryImpl 
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy 

beans = { 
userDetailsService(lablore.MyUserDetailsService) 

    sessionRegistry(SessionRegistryImpl) 

    sessionAuthenticationStrategy(ConcurrentSessionControlStrategy, sessionRegistry) { 
     maximumSessions = -1 
    } 

    concurrentSessionFilter(ConcurrentSessionFilter){ 
     sessionRegistry = sessionRegistry 
     expiredUrl = '/login/concurrentSession' 
    } 

} 

В/плагинов/весна-безопасности основного/CONF/DefaultSecurityConfig. заводной

useHttpSessionEventPublisher = true 

В контроллере:

controller{ 
    def sessionRegistry 

    action(){ 
     def loggedInUsers = sessionRegistry.getAllPrincipals() 
    } 
} 

Это хорошо работает для - пользователи, которые заходят на страницу входа в систему - пользователи, выходящие через ссылку «выхода» -sers who session заканчивается HOWEVER, он НЕ работает для пользователей, которые автоматически аутентифицируются с помощью cookie cookie с сохранением memMe. Он не видит, что у них есть новый сеанс. Если я правильно понимаю, это потому, что RememberMeAuthenticationFilter «дальше вверх» в цепочке фильтров по сравнению с ConcurrentSessionFilter, который является сервером SessionRegistry? Или, я что-то испортил с моими конфигурациями ....

Любая помощь в том, как заставить это работать, было бы здорово!

Спасибо!

+0

http://stackoverflow.com/questions/18161974/is-it-possible-to-get-a-list-of-all-active-sessions – user1690588

+0

другой возможностью было бы использовать прослушиватель сеанса. Ему не важно, как пользователь был аутентифицирован. Http: // StackOverflow.ком/вопросы/24573024/как к магазину-сессии Идентификаторы-и-адъюнкт-их-с пользователем / –

ответ

1

ConcurrentSessionControlStrategy осуждается,

Используйте ConcurrentSessionControlAuthenticationStrategy вместо

В качестве альтернативы,

Вы можете реализовать интерфейс HttpSessionListener, который имеет (событие HttpSessionEvent) sessionCreated и sessionDestroyed (HttpSessionEvent событий) методы, но вы должны добавить класс, который вы использовали

Реализации этот интерфейс уведомляется об изменениях в списке активных сеансов в веб-приложении. Чтобы получать уведомления, класс реализации должен быть настроен в дескрипторе развертывания для веб-приложения.

Вы можете добавить класс реализации в дескрипторе развертывания, как это (т.е. вы web.xml файл)

<listener> 
    <listener-class>com.hazelcast.web.SessionListener</listener-class> 
</listener> 

или с помощью WebXmlConfig плагин в Граалей

Ваш класс реализации может выглядеть следующим образом ниже, см Online users with Spring Security также

class WebSessionListener implements HttpSessionListener{ 

    sessionCreated(HttpSessionEvent se){ 

      //Checked if user has logged in Here and keep record 
       HttpSession webSession = se.getSession(); 

    } 

    sessionDestroyed(HttpSessionEvent se){ 

      //Checked if user has logged in Here and keep record  
      HttpSession webSession = se.getSession(); 
    } 

} 
Смежные вопросы