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

Spring Boot Security凭证校验异常:错误密码未被拦截

Spring Boot HTTP Basic认证错误密码重复请求仍合法的问题解决

问题场景

为Spring Boot应用实现了简单的HTTP Basic认证,部署正常,但出现异常现象:使用错误密码重复请求时,请求仍被判定为合法;仅更换用户名时,应用才会正常拒绝请求并要求正确的账号密码。

当前使用的Security配置代码:

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
        return http.build();
    }
}

原因分析

  1. 浏览器自动缓存认证凭证:这是最常见的诱因。当第一次使用正确用户名和密码发起请求后,浏览器会默认保存HTTP Basic认证的凭证,后续即使手动输入错误密码,浏览器仍会自动发送之前的正确认证头,导致请求被误判为合法。
  2. 未明确配置用户认证逻辑:仅启用HTTP Basic但未自定义用户信息时,Spring Boot会生成临时默认用户(用户名user,密码在启动日志中),若缺少密码编码器或认证细节配置,可能导致认证判断异常。

解决步骤

1. 验证浏览器缓存问题

使用Postman、curl等工具手动构造请求,不依赖浏览器自动填充:

  • 发送携带正确凭证的请求,确认返回正常
  • 手动修改Authorization头中的密码部分,发送错误密码请求,观察是否被拒绝
  • 若此时错误密码请求被正常拒绝,即可确认是浏览器缓存导致的问题

2. 禁用浏览器认证缓存

在Security配置中添加缓存控制规则,禁止浏览器缓存认证相关内容:

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .httpBasic()
            .and()
            .headers()
            .cacheControl()
            .disable();
        return http.build();
    }
}

3. 配置自定义用户认证与密码编码器

避免依赖Spring Boot默认临时用户,明确配置用户信息和密码编码逻辑:

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
        return http.build();
    }

    // 自定义用户信息
    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withUsername("admin")
            .password(passwordEncoder().encode("admin123"))
            .roles("ADMIN")
            .build();
        return new InMemoryUserDetailsManager(user);
    }

    // 密码编码器(必须配置,否则认证会失败)
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:06:17