spring-security-oauth(2.3.4版本)解决There is no PasswordEncoder mapped for the id “null”的问题

背景

最近跟着大神学习撸spring cloud,最后的章节是spring oauth2 保护应用程序的内容,跟着作者讲解找搬demo,但是我使用postman 访问http://localhost:5000/oauth/token 端口获取token时一直不成功,作者的版本比较老(貌似spring boot 是1.5,我的都是最新的稳定版2.x),主要是以下两个错误:

  • 错误一
访问 http://localhost:5000/oauth/token 这个端口时报401 authentication is required, 这时候有两种解决方案,

第一种改代码(未验证): 参考:https://blog.csdn.net/u012040869/article/details/80140515

第二种该请求,即Postman 改成支持basic auth 的方式:
在这里插入图片描述
请求参数如下:
在这里插入图片描述
上面改完后401 的错误没了,怀着激动心情在PostMan 上点 “Send”,然后返回一大推错误,卧槽,一万只草泥马,但是还是的看错误:

There is no PasswordEncoder mapped for the id “null”
..........

不怕,有百度神器,去找一下解决方案:如下:
https://blog.csdn.net/canon_in_d_major/article/details/79675033

看着这老哥的文章我对比下我的代码,发现我已经设置了PasswordEncoder,我的代码如下如下:

@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userServiceDetail).passwordEncoder(new BCryptPasswordEncoder());
    }

所以我的问题和他并不相同,于是只有调试代码了,首先看PasswordEncoder是否设置,发现设置了,然后看它认证的密码,发现

在这里插入图片描述
这里在抽出密码的ID,但是传入的密码是 “123456” 这个密码明显就是我在内容设置的某个client的secret ,按照代码的意思是它期望传入的是某个PasswordEncoder加密后的密码,并且带加密ID的那种,因此需要修改配置客户端的代码:

 @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("user-service")
                .secret("{bcrypt}"+encoder.encode("123456"))
                .scopes("service")
                .authorizedGrantTypes("refresh_token", "password")
                .accessTokenValiditySeconds(3600);
    }

这里方式是把secret 加密后放入内存并且加上{bcrypt} 这个加密方式的ID,然后再次获取token,一切正常了

思考

总感觉这种处理方式很奇怪,是不是有更好的方式,比如加密后返回当前加密方式和密码组合好的字符串,而不是我去拼接。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值