Spring Boot配置oauth2Login与Basic Auth如何隔离securityContext
解决方案
实现原理
Spring Security支持配置多组独立的安全过滤链,每组过滤链可单独指定负责处理的路径范围,链之间的认证、上下文配置完全隔离,不会互相干扰。你之前将所有规则都配置在同一个过滤链中,所以securityContext的全局配置会作用到该链下的所有路径,包括Basic认证的URI。
具体实现步骤
你需要将原有的单安全链配置拆分为两个优先级不同的独立安全链:
- 高优先级链:仅处理
AUTHENTICATED_WITH_BASIC_AUTH指定的路径,单独配置Basic认证规则,不添加CookieSecurityContextRepository相关配置 - 低优先级链:处理所有剩余路径,保留原有的OAuth2登录、SecurityContext存储配置
代码示例
import org.springframework.core.annotation.Order; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.web.SecurityFilterChain; @EnableWebSecurity public class MultiSecurityConfig { // 高优先级Basic认证安全链,Order数字越小优先级越高 @Bean @Order(1) public SecurityFilterChain basicAuthSecurityFilterChain(HttpSecurity http) throws Exception { http.antMatcher(Constants.AUTHENTICATED_WITH_BASIC_AUTH) // 仅处理Basic认证路径 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() // 免认证路径同样放行 .antMatchers(ALLOWED_WITHOUT_AUTHENTICATION).permitAll() .anyRequest().authenticated() .and() .httpBasic().authenticationEntryPoint(myBasicAuthenticationEntryPoint()) .and() .exceptionHandling().accessDeniedPage("/403"); // 此链不配置securityContextRepository,使用默认实现 return http.build(); } // 低优先级全局OAuth2安全链 @Bean @Order(2) public SecurityFilterChain oauth2SecurityFilterChain(HttpSecurity http) throws Exception { http.antMatcher("/**") // 处理所有未匹配到上一个链的剩余路径 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers(ALLOWED_WITHOUT_AUTHENTICATION).permitAll() .anyRequest().authenticated() .and() .oauth2Login().userInfoEndpoint() .oidcUserService(myOidcUserService) .customUserType(MyOidcUser.class, "customUser") .and() .defaultSuccessUrl(authSuccessURL, true) .failureUrl(userNotAuthenticatedURL) .and() .securityContext().securityContextRepository(new CookieSecurityContextRepository(myAuthCookieHelper)) .and() .exceptionHandling().authenticationEntryPoint(getAuthenticationEntryPoint()); return http.build(); } }
注意事项
- 必须先通过
http.antMatcher(路径)指定当前安全链整体的处理范围,再配置后续的认证、授权规则,否则配置会作用到所有路径 - 高优先级的Basic认证链不要配置全局的
/**匹配,否则会覆盖低优先级的OAuth2链
内容的提问来源于stack exchange,提问作者reiley
相关产品推荐
相关产品推荐

