从Spring Session中的SessionDestroyedEvent获取安全上下文

时间:2015-07-16 21:53:42

标签: java spring-session

我正在使用Spring Session 1.0.1。我需要在用户注销时执行一些逻辑,并且我需要依赖于无效的HTTP会话来覆盖用户未能明确注销的情况。

标准Spring Security SessionDestroyedEvent包含任何适用的SecurityContext,但SessionDestroyedEvent的Spring Session版本仅包含会话ID。当此事件触发时,会话不再由SessionRepository保存,因此无法通过id查找它。

有没有办法使用Spring Session从过期的会话中检索SecurityContext?

2 个答案:

答案 0 :(得分:2)

不幸的是没有。问题是,当Redis发起事件时,会话已经消失。此外,从Redis收到的事件不包含原始信息。这意味着无法检索SecurityContext。

有关此内容的更新,请跟踪spring-projects/spring-session/issues/4

答案 1 :(得分:0)

使用Redis进行sind-session 1.1+ https://docs.spring.io/spring-session/docs/current/reference/html5/#httpsession-httpsessionlistener

您必须配置HttpSessionEventPublisher,然后Spring会话将传播sessionDestroy事件

@Configuration
@EnableRedisHttpSession
public class RedisHttpSessionConfig {

        @Bean
        public HttpSessionEventPublisher httpSessionEventPublisher() {
                return new HttpSessionEventPublisher();
        }

        // ...
}

因此,您可以使用标准spting SessionDestroyedEvent侦听器

@Component
public class SessionDestroyListener implements ApplicationListener<SessionDestroyedEvent> {

    @Override
    public void onApplicationEvent(SessionDestroyedEvent event) {
        logger.debug("session destroyed {}", event.getId());
        if(!event.getSecurityContexts().isEmpty()) {
           ...
        }
    }
}