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

Get security context from SessionDestroyedEvent in Spring Session

我正在使用 Spring Session 1.0.1。我需要在用户注销时执行一些逻辑,我需要依靠 HTTP 会话失效来覆盖用户未能显式注销的情况。

标准 Spring 安全 SessionDestroyedEvent 包括任何适用的 SecurityContext,但 SessionDestroyedEvent 的 Spring 会话版本仅包含会话 ID。到此事件触发时,会话不再由 SessionRepository 持有,因此无法通过 ID 查找它。

是否有任何方法可以使用 Spring 会话从过期的会话中检索 SecurityContext?

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

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

对于带有 Redis 的 sring-session 1.1+ https://docs.spring.io/spring-session/docs/current/reference/html5/#httpsession-httpsessionlistener

您必须配置 HttpSessionEventPublisher,之后 spring-session 将传播 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()) {
           ...
        }
    }
}