Spring Security 6多入口点配置引发403错误求助
问题分析与解决方案
你配置了两个SecurityFilterChain后所有API请求返回403,移除第二个配置就恢复正常,核心问题出在第二个过滤器链的匹配范围上:
原因拆解
- 第一个过滤器链(
@Order(1))通过securityMatcher("/api/**", "/" + apiPrefix + "/api/**")明确了仅处理API路径请求,同时配置了API所需的认证提供者(Basic、JWT、X509)、自定义RequestFilter、无状态会话等关键规则。 - 第二个过滤器链(
@Order(2))未设置securityMatcher,这意味着它会匹配所有请求——包括原本应该由第一个链处理的API请求。由于第二个链没有配置API所需的认证逻辑(缺少RequestFilter、对应认证提供者),请求进入这个链后无法完成认证,直接返回403错误。
修复方案
给第二个过滤器链添加明确的securityMatcher,限制它只处理非API请求,避免覆盖第一个链的匹配范围。
修改后的第二个配置示例:
@Configuration @Order(2) public class AnotherWebSecurtyConfigurator { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 指定该链仅处理非API请求,可根据实际业务调整匹配规则 .securityMatcher("/**") // 排除API路径,让这些请求交由第一个链处理 .authorizeHttpRequests((requests) -> requests .requestMatchers("/api/**", "/" + apiPrefix + "/api/**").permitAll() .requestMatchers(HttpMethod.OPTIONS).denyAll() .anyRequest().authenticated()) .csrf(AbstractHttpConfigurer::disable); return http.build(); } }
如果你的第二个链是专门处理前端页面路径,也可以更精准地指定匹配规则:
.securityMatcher("/", "/home/**", "/dashboard/**")
注意事项
- 多个
SecurityFilterChain的匹配规则尽量避免重叠,若必须重叠,通过@Order确保更具体的规则(如API路径)优先匹配。 - 每个过滤器链的配置完全独立,第二个链不会继承第一个链的任何配置(比如认证提供者、过滤器),必须确保每个链只处理自身负责的请求范围。
内容的提问来源于stack exchange,提问作者Md Rehman
相关产品推荐
相关产品推荐

