配置SecurityFilterChain后未匹配路径默认开放是否为预期行为?
这是Spring Security的预期设计
当你显式定义带有securityMatcher的SecurityFilterChain Bean时,Spring Security会不再启用默认的全局过滤器链,仅使用你定义的、针对匹配路径的过滤器链处理请求。
那些未被securityMatcher("/api/**")匹配到的路径(比如/whatever),不会经过任何Spring Security的过滤逻辑,因此会直接处于公开可访问状态,这就是你看到的现象。
解决办法
如果你希望非/api路径保持默认的拦截状态,可以通过以下两种方式实现:
方式一:合并规则到同一个过滤器链
去掉securityMatcher,把/api的权限规则和全局规则放在同一个过滤器链中:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authz -> authz .requestMatchers("/api/**").hasAuthority("USER") .anyRequest().authenticated()) .httpBasic(withDefaults()); return http.build(); }
方式二:新增全局过滤器链
额外定义一个不指定securityMatcher的SecurityFilterChain,专门处理所有非/api的路径,保持默认的认证要求:
// 处理/api路径的过滤器链 @Bean public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) throws Exception { http.securityMatcher("/api/**") .authorizeHttpRequests(authz -> authz .anyRequest().hasAuthority("USER")) .httpBasic(withDefaults()); return http.build(); } // 处理所有其他路径的全局过滤器链 @Bean public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authz -> authz .anyRequest().authenticated()) .httpBasic(withDefaults()); return http.build(); }
注意:多个过滤器链的执行顺序由匹配精度自动决定,更具体的规则(如
/api/**)会优先执行;若需自定义顺序,可通过@Order注解指定优先级。
内容的提问来源于stack exchange,提问作者Remy
相关产品推荐
相关产品推荐

