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(); } }
原因分析
- 浏览器自动缓存认证凭证:这是最常见的诱因。当第一次使用正确用户名和密码发起请求后,浏览器会默认保存HTTP Basic认证的凭证,后续即使手动输入错误密码,浏览器仍会自动发送之前的正确认证头,导致请求被误判为合法。
- 未明确配置用户认证逻辑:仅启用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
相关产品推荐
相关产品推荐

