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

SpringBoot 3.1.2如何配置安全类让过滤器仅作用于指定API

解决SpringBoot 3.1.2中/api/dummy/**跳过AuthTokenFilter的问题

方案一:多过滤器链配置(推荐)

Spring Security 3.x支持通过多个securityMatcher配置独立的过滤器链,让指定路径走无过滤规则,其他路径走带过滤器的规则:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception {
    // 处理/api/dummy/**请求:直接放行,不加载AuthTokenFilter
    http.securityMatcher(mvc.pattern("/api/dummy/**"))
            .csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(auth -> auth.anyRequest().permitAll())
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

    // 处理其他所有请求:需要认证,应用AuthTokenFilter
    http.securityMatcher(mvc.pattern("/**"))
            .csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authenticationProvider(authenticationProvider)
            .addFilterBefore(new AuthTokenFilter(serviceA, serviceB), AuthenticationFilter.class);

    return http.build();
}

Spring Security会根据请求路径匹配对应过滤器链,/api/dummy/**的请求不会进入带AuthTokenFilter的链,自然跳过过滤逻辑。

方案二:通过FilterRegistrationBean配置拦截/排除路径

将AuthTokenFilter注册为Servlet容器过滤器,直接指定拦截和排除路径:

// 先把AuthTokenFilter定义为Bean
@Bean
public AuthTokenFilter authTokenFilter(ServiceA serviceA, ServiceB serviceB) {
    return new AuthTokenFilter(serviceA, serviceB);
}

// 配置过滤器的拦截规则
@Bean
public FilterRegistrationBean<AuthTokenFilter> authTokenFilterRegistration(AuthTokenFilter authTokenFilter) {
    FilterRegistrationBean<AuthTokenFilter> registrationBean = new FilterRegistrationBean<>(authTokenFilter);
    registrationBean.addUrlPatterns("/**"); // 拦截所有请求
    registrationBean.addExcludeUrlPatterns("/api/dummy/**"); // 排除指定路径
    registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 保证过滤器执行优先级
    return registrationBean;
}

注意:使用该方案时,需移除原SecurityFilterChain中的addFilterBefore调用,避免过滤器被重复加载。

方案三:过滤器内部判断跳过(快速临时解决)

如果不想调整配置结构,直接在AuthTokenFilter的doFilterInternal方法开头判断路径,符合条件就直接放行:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    String requestUri = request.getRequestURI();
    // 匹配/api/dummy/**路径则直接放行
    if (requestUri.startsWith("/api/dummy/")) {
        filterChain.doFilter(request, response);
        return;
    }
    // 原有的Token校验逻辑
    // ...
}

这种方式简单直接,但过滤逻辑耦合在过滤器内部,适合临时快速解决问题。

内容的提问来源于stack exchange,提问作者Shreya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:56:24