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

Posted

技术标签:

【中文标题】如何使用spring security在grails中获取所有当前登录用户的列表(包括rememberme cookie)【英文标题】:how to obtain a list of all currently logged-in users (including rememberme cookies) in grails with spring security 【发布时间】:2014-03-14 09:10:21 【问题描述】:

我正在构建一个具有 spring-security-core 1.2.7.3 插件以及 spring-security-ui 0.2 插件的 grails 应用程序,并且希望获取当前登录的所有用户的列表(即有一个当前活动的会话)。用户可以通过登录控制器 (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 自动进行身份验证的用户。它没有看到他们有一个新创建的会话。 如果我理解正确,这是因为与运行 sessionRegistry 的 ConcurrentSessionFilter 相比,RememberMeAuthenticationFilter 在过滤器链中“更靠前”?或者,我的配置搞砸了……

任何关于如何使它工作的帮助都会很棒!

谢谢!!

【问题讨论】:

***.com/questions/18161974/… 另一种可能性是使用会话监听器。它不应该关心用户是如何被认证的。 ***.com/questions/24573024/… 【参考方案1】:

ConcurrentSessionControlStrategy 已弃用,

改用ConcurrentSessionControlAuthenticationStrategy

或者,

你可以实现HttpSessionListener接口,它有sessionCreated(HttpSessionEvent事件)和sessionDestroyed(HttpSessionEvent事件)方法,但是你必须添加你使用的类

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

您可以像这样将实现类添加到您的部署描述符中(即您的 web.xml 文件)

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

或使用 grails 中的 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();
     


【讨论】:

以上是关于如何使用spring security在grails中获取所有当前登录用户的列表(包括rememberme cookie)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 grails 和现有 oauth2 提供程序中使用 Spring Security 实现基于表单的登录

如何在 Grails 和 AngularJS 上使用 Spring Security 进行 Ajax 登录

如何在 Grails 中使用 spring security rest 插件进行身份验证

Grails + spring-security-core:用户登录后如何分配角色?

如何在 Grails 中使用 Spring Security 检查用户在线状态?

如何使用 Grails Spring Security Plugin (Requestmap)