手动注销grails中的其他用户

时间:2015-01-08 10:58:01

标签: grails spring-security

在我的应用程序中,我需要以编程方式注销用户,而不是当前用户。我能够使其会话到期,但这不会强制注销该特定用户。所以我的问题是,如何强制退出用户的下一个请求?这是我现在的代码:

sessionRegistry.getAllPrincipals().each {
   principal = it
   sessionRegistry.getAllSessions(it, false).each {
       if (principal.username == userSec.username) {
           it.expireNow()
       }
   }
}

我在我的resources.groovy中有这个:

sessionRegistry(SessionRegistryImpl)
    sessionAuthenticationStrategy(ConcurrentSessionControlStrategy, sessionRegistry) {
        maximumSessions = -1
    }
    concurrentSessionFilter(ConcurrentSessionFilter){
        sessionRegistry = sessionRegistry
        expiredUrl = '/login/concurrentSession'
    }

1 个答案:

答案 0 :(得分:1)

使用会话机制是不可能的。您必须使用可以保留用户的存储介质。此介质可以是RAM内单例,如ConcurrentHashMap实例,也可以是DB,具体取决于您的集群架构。

然后在每次调用springSecurityService.currentUser时(例如在Spring Security核心插件中),您必须检查sessionRegistry是否包含该用户,如果没有,则使会话或用户无效