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 的方式:
spring-security-oauth(2.3.4版本)解决There is no PasswordEncoder mapped for the id “null”的问题_第1张图片
请求参数如下:
spring-security-oauth(2.3.4版本)解决There is no PasswordEncoder mapped for the id “null”的问题_第2张图片
上面改完后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是否设置,发现设置了,然后看它认证的密码,发现

spring-security-oauth(2.3.4版本)解决There is no PasswordEncoder mapped for the id “null”的问题_第3张图片
这里在抽出密码的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,一切正常了

思考

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

你可能感兴趣的:(环境搭建,疑难杂症,错误记录,java错误)