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

Spring Boot OAuth2 grant_type=password始终返回invalid_grant Bad Credentials求助

修复方案

1. 优先排查用户密码加密匹配问题

你当前使用的BCryptPasswordEncoder生成的哈希值每次运行结果不同,但匹配时可以正常校验,首先确认:

  • 数据库存储的用户密码字段,是你通过启动类run方法打印的BCrypt加密值,而非明文pass
  • 新增临时测试代码验证密码匹配性,在启动类run方法中补充:
// 替换为你实际存入数据库的加密密码字符串
String dbEncryptedPassword = "$2a$10xxxxxxxxxxxx";
System.out.println("密码匹配结果:" + passwordEncoder.matches("pass", dbEncryptedPassword));

如果输出false,重新生成加密值写入数据库即可。

2. 排查UserService查询逻辑

修改loadUserByUsername方法新增日志,确认用户查询链路正常:

@Override
public AuthUser loadUserByUsername(String username) {
    logger.info("请求查询用户:{}", username);
    AuthUser user = userRepository.findByUsername(username)
                .orElseThrow(() -> {
                    logger.error("用户{}不存在", username);
                    return new UsernameNotFoundException("User not found");
                });
    logger.info("查询到用户:{},存储加密密码:{}", username, user.getPassword());
    return user;
}

调用password模式接口后查看日志:

  • 无日志输出:说明请求被提前拦截,检查SecurityConfig是否缺少Http安全配置
  • 提示用户不存在:核对请求参数username的值与数据库存储的用户名是否完全一致
  • 正常返回用户信息:说明密码校验逻辑异常,检查你的AuthUser实体类是否正确实现UserDetails接口,getPassword()方法返回值是否为数据库存储的加密密码字段,isEnabled()、isAccountNonExpired()等权限校验方法是否全部返回true。

3. 补全SecurityConfig配置

你当前的SecurityConfig缺失Http安全规则配置,补充如下代码:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .csrf().disable();
}

4. 配置校验

确认配置中心的config.security.oauth.jwt.key配置正常加载,没有空值问题;你当前的客户端配置、授权服务端配置逻辑无错误,不需要修改。


内容的提问来源于stack exchange,提问作者María Cristina Fernández López

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:39:03