版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yingziisme/article/details/82635190
记录一下今天工作的时候升级一个认证服务遇到的小问题,虽然最后解决只有一行代码,却花了差不多3个小时。
初始版本为
springboot 1.5.9.RELEASE
springcloud Dalston.SR1
升级为
springboot 2.0.3.RELEASE
springcloude finchley.RELEASE
升级改造完成之后,服务运行正常,但是请求认证的时候报错:
http://localhost:9000/oauth/token?grant_type=password&scope=app&client_id=client_2&client_secret=123456&username=user&password=123456
回复
{
“error”: “invalid_client”,
“error_description”: “Bad client credentials”
}
查看后端代码log
2018-09-12 00:49:40.910 WARN 519 — [nio-9000-exec-2] o.s.s.c.bcrypt.BCryptPasswordEncoder : Encoded password does not look like BCrypt
改了各种配置。看各种配置文档之后在CSDN找到一篇有用的博客
https://blog.csdn.net/smollsnail/article/details/78934188
根据这个修改了两处代码之后可以运行也不报错了
@Bean
public PasswordEncoder bCryptPasswordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
复制
这里.secret(bCryptPasswordEncoder.encode(“123456”))也要加密
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
//配置两个客户端,一个用于password认证一个用于client认证
clients.inMemory()
.withClient("client_2")
.resourceIds(DEMO_RESOURCE_ID)
.authorizedGrantTypes("password", "refresh_token")
.scopes("app")
.authorities("ROLE_APP")
.secret(bCryptPasswordEncoder.encode("123456"))
.accessTokenValiditySeconds(60 * 30)
.refreshTokenValiditySeconds(60 * 60);
}
复制
但是这样数据库存储的密码的样子就变化了
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
复制
原本的系统里面的数据就要修改。 以及一些其他的问题。不能修改原来数据库的数据。
于是猜想把加密模式换回直接bCrypt加密类,居然真的成功了,并没有强制要用新加的工厂模式
@Bean
public PasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
复制
之后可能还需要再看下源码,猜想是以前在
.secret(bCryptPasswordEncoder.encode(“123456”))
这里不用加密,现在这里也要默认加密匹配。所以最终的修改方案仅仅需要把原本
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
//配置两个客户端,一个用于password认证一个用于client认证
clients.inMemory()
.withClient("client_2")
.resourceIds(DEMO_RESOURCE_ID)
.authorizedGrantTypes("password", "refresh_token")
.scopes("app")
.authorities("ROLE_APP")
.secret("123456")
.accessTokenValiditySeconds(60 * 30)
.refreshTokenValiditySeconds(60 * 60);
}
复制
修改后
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
//配置两个客户端,一个用于password认证一个用于client认证
clients.inMemory()
.withClient("client_2")
.resourceIds(DEMO_RESOURCE_ID)
.authorizedGrantTypes("password", "refresh_token")
.scopes("app")
.authorities("ROLE_APP")
.secret(bCryptPasswordEncoder.encode("123456"))
.accessTokenValiditySeconds(60 * 30)
.refreshTokenValiditySeconds(60 * 60);
}
复制
就解决了升级之后认证报错的问题。虽然最后的解决方案仅仅改动了一行代码。但是前后花了3个多小时才搞定。