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
相关产品推荐
相关产品推荐

