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

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=[]

排查方向

  1. 密码编码一致性检查

    • 确认SecurityConfig中配置的密码编码器(如BCryptPasswordEncoder),与存储用户密码时使用的编码器完全匹配。若存储的是MD5哈希值,但Security默认用BCrypt校验,会直接导致凭证不匹配
    • 检查ClientEntity实现UserDetails的getPassword()方法,是否正确返回数据库中存储的密码字符串
  2. UserDetails实现完整性验证

    • 确认ClientEntity的isAccountNonExpired()、isAccountNonLocked()、isCredentialsNonExpired()、isEnabled()方法均返回true(当前clientIsBlocked=false,isAccountNonLocked()应返回!clientIsBlocked)
    • 确保getUsername()方法返回用户邮箱(因为登录逻辑以邮箱作为用户名标识)
  3. AuthenticationManager配置校验

    • 检查SecurityConfig中是否正确配置AuthenticationManager,确保其关联的UserDetailsService是ClientService的正确实现
    • 验证ClientService的loadUserByUsername()方法,能否通过传入的邮箱正确查询到对应的ClientEntity实例
  4. 请求参数传递校验

    • 确认登录请求中的密码在前后端传递过程中未被篡改(如编码转义、格式错误等)

内容的提问来源于stack exchange,提问作者Rodrigo M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:31:17