Spring Security中MVC控制器授权问题:/invoice-result请求遭拦截
问题核心
你的场景中存在两个Spring Security Filter Chain(defaultSecurityFilterChain和apiSecurityFilterChain),请求被优先级更高的apiSecurityFilterChain拦截,而该链未配置/invoice-result的放行规则,导致即使defaultSecurityFilterChain配置了permitAll()也不生效。
具体解决步骤
明确FilterChain的匹配范围与优先级
Spring Security会根据FilterChain的@Order注解值确定执行顺序,数值越小优先级越高。检查apiSecurityFilterChain的请求匹配规则(比如是否误用anyRequest()而非antMatcher("/api/**")),确保它仅匹配API前缀的请求,避免覆盖/invoice-result路径。为apiSecurityFilterChain添加放行规则
如果apiSecurityFilterChain的匹配范围确实包含/invoice-result(比如全局匹配),需在该链中显式添加放行配置:@Bean public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .requestMatchers("/invoice-result").permitAll() .requestMatchers("/api/**").authenticated() // 其他授权规则 ) // 其他Security配置(如CSRF、会话管理等) return http.build(); }配置正确的FilterChain优先级
确保apiSecurityFilterChain仅处理API请求,defaultSecurityFilterChain处理其余请求,通过@Order明确优先级:@Bean @Order(1) // 高优先级,仅处理/api前缀请求 public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) throws Exception { http .antMatcher("/api/**") .authorizeHttpRequests(auth -> auth.anyRequest().authenticated()) return http.build(); } @Bean @Order(2) // 低优先级,处理非API请求 public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .requestMatchers("/invoice-result").permitAll() .anyRequest().authenticated() ) return http.build(); }验证转发路径的拦截规则
确认PaymentNotAvailableController转发到index.html的操作不会触发新的路径拦截,若index.html需要放行,也需在对应FilterChain中添加requestMatchers("/index.html").permitAll()。
内容的提问来源于stack exchange,提问作者Dmitriy Gerassimenko

