如何存储会话ID并将其与用户关联

时间:2014-07-04 11:12:42

标签: spring grails spring-security

我有一个CustomSecurityEventListener可以在成功验证后获取事件,CustomHttpSessionListener可以设置最长非活动会话时间。

class CustomSecurityEventListener implements ApplicationListener<AbstractAuthenticationEvent>, LogoutHandler {

    def grailsApplication
    def sessionRegistry

    @Transactional
    void onApplicationEvent(AbstractAuthenticationEvent event) throws AuthenticationException {
        if(event instanceof AuthenticationSuccessEvent){
            // user auditing actions

        }
}

我想用web界面实现会话管理器,其中管理员可以撤销属于给定用户的会话。

| userName1 | JSESSIONID1234 | action -> revoke |
| userName2 | JSESSIONID4321 | action -> revoke |

您是否有任何adea如何通过使用自定义侦听器(使用sessionCreated()sessionDestroyed()方法)将sessionId与用户关联,并将用户会话对存储在例如。 “activeSession”系列。

我不想将sessionId存储为Spring Security User类中的属性。

先谢谢。

1 个答案:

答案 0 :(得分:2)

我在运行功能测试时使用以下侦听器代码来清理会话。

不完全是您正在寻找的内容,但getAllPrincipals()显示了如何从会话中获取用户(我使用':spring-security-core:1.2.7.3'创建了该代码)。

import static org.springframework.security.web.context.HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY

class SessionListener implements HttpSessionListener {
    def sessions = [:].asSynchronized()

    void sessionCreated (HttpSessionEvent se) {
        sessions.put(se.session.id, se.session)
    }

    void sessionDestroyed (HttpSessionEvent se) {
        sessions.remove(se.session.id)
    }

    void invalidateSessions () {
        def httpSessions = sessions.collect {String sessionId, HttpSession session ->
            session
        }

        httpSessions.each { HttpSession session ->
            session.invalidate()
        }
    }

    def getAllPrincipals () {
        def principals = []
        sessions.each { String sessionId, HttpSession session ->
            SecurityContext securityContext = session[SPRING_SECURITY_CONTEXT_KEY]
            def authentication = securityContext?.authentication
            principals << authentication?.principal
        }
        principals = principals.findAll {it != null}
        principals
    }
}