You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:38:16