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
相关产品推荐
相关产品推荐

