Spring Boot3.0.4中requireExplicitAuthenticationStrategy配置冲突求助
Spring Security6 解决requireExplicitAuthenticationStrategy与maximumSessions、invalidSessionUrl冲突方案
问题根源
Spring Security6中,requireExplicitAuthenticationStrategy(true)会强制要求必须显式配置SessionAuthenticationStrategy,不允许框架自动生成相关策略。而配置maximumSessions=1(对应ConcurrentSessionControlAuthenticationStrategy)和invalidSessionUrl(对应InvalidSessionStrategy)时,框架原本会自动创建并组合这些策略,两者规则冲突导致启动报错。
解决方案
手动创建并组合所需的SessionAuthenticationStrategy,同时保留原有会话控制逻辑:
步骤1:定义SessionRegistry Bean
ConcurrentSessionControlAuthenticationStrategy需要依赖SessionRegistry跟踪会话,先注册这个Bean:
@Bean public SessionRegistry sessionRegistry() { return new SessionRegistryImpl(); }
步骤2:手动组合SessionAuthenticationStrategy
将处理单会话限制和无效会话跳转的策略通过CompositeSessionAuthenticationStrategy组合,显式配置到SecurityFilterChain中:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, SessionRegistry sessionRegistry) throws Exception { // 处理无效会话跳转的策略 InvalidSessionStrategy invalidSessionStrategy = new SimpleInvalidSessionStrategy("/?r=invalidSessionUrlLogin"); // 处理单会话限制的策略 ConcurrentSessionControlAuthenticationStrategy concurrentStrategy = new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry); concurrentStrategy.setMaximumSessions(1); // 组合两个策略 CompositeSessionAuthenticationStrategy compositeStrategy = new CompositeSessionAuthenticationStrategy(Arrays.asList(concurrentStrategy, invalidSessionStrategy)); http // 其他安全配置... .sessionManagement(sessions -> sessions .requireExplicitAuthenticationStrategy(true) .sessionAuthenticationStrategy(compositeStrategy) .sessionRegistry(sessionRegistry) ); return http.build(); }
关键说明
- 显式组合策略后,无需再调用
maximumSessions()和invalidSessionUrl()的链式配置,避免重复触发框架自动生成策略的逻辑 CompositeSessionAuthenticationStrategy会按顺序执行传入的策略列表,确保原有单会话限制和无效会话跳转的功能正常生效- 保持
requireExplicitAuthenticationStrategy(true)的配置,满足显式策略的要求
内容的提问来源于stack exchange,提问作者ucas
相关产品推荐
相关产品推荐

