我正在使用Spring Session 1.0.1。我需要在用户注销时执行一些逻辑,并且我需要依赖于无效的HTTP会话来覆盖用户未能明确注销的情况。
标准Spring Security SessionDestroyedEvent包含任何适用的SecurityContext,但SessionDestroyedEvent的Spring Session版本仅包含会话ID。当此事件触发时,会话不再由SessionRepository保存,因此无法通过id查找它。
有没有办法使用Spring Session从过期的会话中检索SecurityContext?
答案 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()) {
...
}
}
}