欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Security报错:There is no PasswordEncoder mapped for the id “null“

程序员文章站 2022-04-14 22:52:33
...

错误描述,如下图:Spring Security报错:There is no PasswordEncoder mapped for the id “null“
解决方案:
关于 Spring Security 5.0.X 的说明:
在Spring Security 5.0之前,PasswordEncoder 的默认值为 NoOpPasswordEncoder 既表示为纯文本密码,在实际的开发过程中 PasswordEncoder 大多数都会设值为 BCryptPasswordEncoder ,但是这样会导致几个问题:
1、在应用程序中使用 BCryptPasswordEncoder 编码方式编码后的密码,很难轻松的迁移;
2、密码存储后,会再次被更改;
3、作为一个应用中的安全框架,Spring Security 不能频繁地进行中断更改;

在 Spring Security 5.0.x 以后,密码的一般格式为:{ID} encodedPassword ,ID 主要用于查找 PasswordEncoder 对应的编码标识符,并且encodedPassword 是所选的原始编码密码 PasswordEncoder。ID 必须书写在密码的前面,开始用{,和 结束 }。如果 ID 找不到,ID 则为null。例如,在相关的源码中,我找到了 Spring Security 定义的不同的编码方式的列表 ID。所有原始密码都是“ password ”。

源码中定义的全部编码方式的列表 ID 如下图:

Spring Security报错:There is no PasswordEncoder mapped for the id “null“
解决办法:
修改前用户的认证规则:
Spring Security报错:There is no PasswordEncoder mapped for the id “null“
新建一个PasswordEncoder并实现PasswordEncoder接口,重写里面的两个方法,并定义为明文的加密方式,代码如下:

public class CustomPasswordEncoder implements PasswordEncoder {
    @Override
    public String encode(CharSequence charSequence) {
        return charSequence.toString();
    }

    @Override
    public boolean matches(CharSequence charSequence, String s) {
        return s.equals(charSequence.toString());
    }
}

修改后的认证规则:

@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("zhangsan").password("123456").roles("VIP1")
                .and()
                .withUser("lisi").password("123456").roles("VIP1", "VIP2")
                .and()
                .withUser("wangwu").password("123456").roles("VIP1", "VIP2", "VIP3")
                .and()
                .passwordEncoder(new CustomPasswordEncoder());
    }

然后重试即可。