从 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()) {
...
}
}
}
我正在使用 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()) {
...
}
}
}