前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring-cloud-oauth2升级版本遇到的问题

spring-cloud-oauth2升级版本遇到的问题

作者头像
yingzi_code
发布2019-08-31 13:41:49
8460
发布2019-08-31 13:41:49
举报
文章被收录于专栏:生活不止眼前的代码

版权声明:本文为博主原创文章,遵循 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 根据这个修改了两处代码之后可以运行也不报错了

代码语言:javascript
复制
@Bean
public PasswordEncoder bCryptPasswordEncoder() {
    return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

这里.secret(bCryptPasswordEncoder.encode(“123456”))也要加密

代码语言:javascript
复制
@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);
}

但是这样数据库存储的密码的样子就变化了

代码语言:javascript
复制
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG

原本的系统里面的数据就要修改。 以及一些其他的问题。不能修改原来数据库的数据。

于是猜想把加密模式换回直接bCrypt加密类,居然真的成功了,并没有强制要用新加的工厂模式

代码语言:javascript
复制
@Bean
public PasswordEncoder bCryptPasswordEncoder() {
     return new BCryptPasswordEncoder();
 }

之后可能还需要再看下源码,猜想是以前在 .secret(bCryptPasswordEncoder.encode(“123456”)) 这里不用加密,现在这里也要默认加密匹配。所以最终的修改方案仅仅需要把原本

代码语言:javascript
复制
@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);
}

修改后

代码语言:javascript
复制
@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个多小时才搞定。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年09月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档