如何使用spring security获取grails中所有当前登录用户(包括rememberme cookie)的列表

时间:2014-02-14 20:29:53

标签: authentication grails cookies spring-security

我正在构建一个grails应用程序,它具有spring-security-core 1.2.7.3插件以及spring-security-ui 0.2插件,并希望获得当前登录的所有用户的列表(即具有当前活动的会话)。用户可以通过登录控制器(daoAuthenticationProvider)登录,也可以通过rememberMe cookie自动登录。 我已经实现了下面的代码,使用ConcurrentSessionControlStrategy来创建sessionRegistry:

在/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'
    }

}

在/plugins/spring-security-core/conf/DefaultSecurityConfig.groovy

useHttpSessionEventPublisher = true

在控制器中:

controller{
    def sessionRegistry

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

效果很好 - 通过登录页面登录的用户 - 通过“注销”链接注销的用户 - 会话到期的用户 但是,对于使用rememberMe cookie自动进行身份验证的用户,它不起作用。它没有看到他们有一个新创建的会话。 如果我理解正确,这是因为与ConcurrentSessionFilter(运行sessionRegistry的那个)相比,RememberMeAuthenticationFilter在过滤器链中“更进一步”?或者,我对我的配置搞砸了......

任何有关如何使其发挥作用的帮助都会很棒!

谢谢!

1 个答案:

答案 0 :(得分:1)

{@ 3}}已弃用,

使用ConcurrentSessionControlStrategy代替

可替换地,

您可以实施具有ConcurrentSessionControlAuthenticationStrategyHttpSessionListener事件)和sessionCreatedHttpSessionEvent事件)方法的sessionDestroyed界面,但您必须添加你使用的课程

此接口的实现会通知Web应用程序中活动会话列表的更改。要接收通知事件,必须在Web应用程序的部署描述符中配置实现类。

您可以将实现类添加到部署描述符中(例如web.xml文件)

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

或使用grails中的HttpSessionEvent插件

您的实施类可能如下所示,请参阅WebXmlConfig

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();
     }

}