【问题标题】:Get security context from SessionDestroyedEvent in Spring Session从 Spring Session 中的 SessionDestroyedEvent 获取安全上下文
【发布时间】:2015-10-06 13:06:51
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring-session


    【解决方案1】:

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

    如需更新,请追踪spring-projects/spring-session/issues/4

    【讨论】:

      【解决方案2】:

      对于带有 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()) {
                 ...
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-11-12
        • 2019-06-15
        • 2013-01-27
        • 2011-09-03
        • 2015-11-29
        • 2015-09-13
        • 2022-12-19
        • 2020-09-20
        • 1970-01-01
        相关资源
        最近更新 更多