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

手动实现Spring Security认证时遭遇BadCredentialsException问题求助

排查分析与解决方法

咱们一步一步拆解这个问题,BadCredentialsException说白了就是Spring Security认为你传入的用户名或密码不匹配,结合你的代码来看,主要有这几个可能的原因和对应的解决办法:

1. 核心逻辑错误:仅修改内存对象,未更新数据库密码

你当前代码里,只是把生成的OTP设置给了内存中的user对象,但并没有把这个密码同步更新到数据库里。而Spring Security的认证逻辑是通过UserDetailsService去数据库查询用户的真实密码来比对的,数据库里还是旧密码,自然和你传入的OTP匹配不上,直接抛出异常。

解决办法:
先把生成的密码加密后更新到数据库,再用明文OTP发起认证(Spring Security会自动加密后和数据库密文比对)。修改后的代码大概是这样:

// 需要注入PasswordEncoder和UserRepository
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private UserRepository userRepository;

@Override
public Boolean authenticateUser(User user) {
    // 生成明文OTP
    String rawOtp = Utils.generateOtp(6).toString();
    // 加密OTP
    String encodedOtp = passwordEncoder.encode(rawOtp);
    // 更新数据库中对应用户的密码
    userRepository.updatePasswordByUsername(user.getUsername(), encodedOtp);
    // 用明文OTP构造认证请求
    UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user.getUsername(), rawOtp);
    Authentication auth = authManager.authenticate(authReq);
    SecurityContextHolder.getContext().setAuthentication(auth);
    return true;
}

2. 密码编码器配置缺失或不匹配

Spring Security默认要求密码必须加密存储,并且需要配置对应的PasswordEncoder。如果你的数据库里的密码是用BCrypt加密的,但配置里没指定BCryptPasswordEncoder,或者你用的加密算法和配置的编码器不一致,都会导致密码比对失败。

解决办法:
在你的Spring Security配置类中添加密码编码器的Bean:

@Bean
public PasswordEncoder passwordEncoder() {
    // 推荐用BCrypt,安全性高
    return new BCryptPasswordEncoder();
}

// 正确配置AuthenticationManager
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {
    return authConfig.getAuthenticationManager();
}

3. UserDetailsService未正确加载用户信息

如果你的UserDetailsService实现有问题,比如没有根据传入的用户名查询到对应的用户,或者返回的UserDetails对象中的密码和数据库存储的不一致,也会触发这个异常。

检查点:

  • 调试UserDetailsService的loadUserByUsername方法,确认它能正确查询到目标用户。
  • 查看返回的UserDetails的getPassword()方法返回值,是否和数据库中存储的加密密码一致。

4. 用户名输入错误

虽然看起来简单,但也要确认你传入的user.getUsername()确实是数据库中存在的用户名,没有拼写错误或者大小写问题(默认情况下Spring Security对用户名是大小写敏感的,除非你配置了忽略大小写)。


内容的提问来源于stack exchange,提问作者Jainesh kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:42:13