Spring Security认证返回Bad Credentials问题排查(MongoDB环境)
Spring Security + MongoDB 认证抛出Bad Credentials异常排查
- 按教程实现基于MongoDB的Spring Security用户认证,唯一差异是基于已有
ClientEntity类实现UserDetails接口 - 输入正确邮箱与密码时,调用
authenticationManager.authenticate()始终抛出Bad Credentials异常 - 存储的用户凭证与请求传入的完全一致,但调试显示
UsernamePasswordAuthenticationToken的Authenticated状态为false
用户数据
ClientEntity(id=63166ddbe3ea6c4fffd70818, clientName=Test, clientCpf=000.000.000-00, clientEmail=teste2@example.com, clientPassword=2b598e4c0e79baf9dc9211ad303e7626, clientIsBlocked=false, clientBirthDate=1989-05-20, creditCards=[CreditCardEntity()], clientCategory=[ACAO, COMEDIA])
登录请求参数
AccountCredentials: AccountCredentials(email=teste2@example.com, password=2b598e4c0e79baf9dc9211ad303e7626)
调试信息
UsernamePasswordAuthenticationToken Credentials=[PROTECTED], Authenticated=false, Details=null, Granted Authorities=[]
排查方向
密码编码一致性检查
- 确认
SecurityConfig中配置的密码编码器(如BCryptPasswordEncoder),与存储用户密码时使用的编码器完全匹配。若存储的是MD5哈希值,但Security默认用BCrypt校验,会直接导致凭证不匹配 - 检查
ClientEntity实现UserDetails的getPassword()方法,是否正确返回数据库中存储的密码字符串
- 确认
UserDetails实现完整性验证
- 确认
ClientEntity的isAccountNonExpired()、isAccountNonLocked()、isCredentialsNonExpired()、isEnabled()方法均返回true(当前clientIsBlocked=false,isAccountNonLocked()应返回!clientIsBlocked) - 确保
getUsername()方法返回用户邮箱(因为登录逻辑以邮箱作为用户名标识)
- 确认
AuthenticationManager配置校验
- 检查
SecurityConfig中是否正确配置AuthenticationManager,确保其关联的UserDetailsService是ClientService的正确实现 - 验证
ClientService的loadUserByUsername()方法,能否通过传入的邮箱正确查询到对应的ClientEntity实例
- 检查
请求参数传递校验
- 确认登录请求中的密码在前后端传递过程中未被篡改(如编码转义、格式错误等)
内容的提问来源于stack exchange,提问作者Rodrigo M
相关产品推荐
相关产品推荐

