0

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

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

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

4

2 回答 2

2

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

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

于 2015-07-21T03:51:47.287 回答
0

对于带有 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()) {
           ...
        }
    }
}
于 2017-11-23T11:31:32.887 回答