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

