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

如何在Spring Boot过滤器链中禁用UsernamePasswordAuthenticationFilter

解决方案

1. 调整Security配置类

先把Spring Security默认的认证过滤器(比如UsernamePasswordAuthenticationFilter、Basic认证过滤器)全部禁用,避免它们自动加载,再把自定义过滤器加到合适的执行位置。

修改后的configure方法代码:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .cors()
        .and()
        // 关闭默认的表单登录和Basic认证,阻止不需要的过滤器加载
        .formLogin().disable()
        .httpBasic().disable()
        .authorizeRequests()
            .anyRequest().authenticated()
        .and()
        // 将自定义过滤器放在SecurityContextPersistenceFilter之后,这是Security链中较早的节点,确保自定义校验优先执行
        .addFilterAfter(btoBSecurityFilter, SecurityContextPersistenceFilter.class);
}

2. 改造自定义过滤器

删掉所有和SecurityContext相关的代码,直接在过滤器内实现专属的认证校验逻辑——校验通过就放行请求,不通过直接返回错误响应,完全脱离Spring Security的认证上下文机制。

改造后的过滤器代码:

@Component
public class BtoBSecurityFilter extends OncePerRequestFilter {

    private static final Logger logger = LoggerFactory.getLogger(BtoBSecurityFilter.class);

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // 这里编写你的实际认证逻辑,比如校验请求头token、验签等
        boolean passValidation = validateRequest(request);
        
        if (passValidation) {
            filterChain.doFilter(request, response);
            logger.info("请求通过自定义认证校验");
        } else {
            // 校验失败直接返回401未授权
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            response.getWriter().write("认证失败,请检查请求凭证");
            logger.warn("请求未通过自定义认证校验");
        }
    }

    // 示例校验逻辑,请替换为你的业务规则
    private boolean validateRequest(HttpServletRequest request) {
        String token = request.getHeader("X-B2B-Token");
        // 这里可以替换为数据库查询、token签名验证等实际逻辑
        return token != null && token.equals("your-valid-business-token");
    }
}

关键说明

  • 禁用默认认证机制:formLogin().disable()和httpBasic().disable()会阻止Spring Security加载默认的认证过滤器,包括你不想启用的UsernamePasswordAuthenticationFilter。
  • 过滤器位置选择:用addFilterAfter指定在SecurityContextPersistenceFilter之后执行,这个过滤器是Spring Security链中较早的节点,能保证自定义校验逻辑优先于其他安全逻辑执行,避免被默认逻辑干扰。
  • 脱离SecurityContext依赖:不再使用SecurityContextHolder存储认证信息,完全依靠自定义过滤器处理认证流程,符合你不想碰SecurityContext的需求。

这样配置后,请求的认证逻辑将完全由你的自定义过滤器掌控,不会有多余的默认过滤器参与。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:27:36