Spring boot 2.0.1引用的security 依赖是 spring security 5.X版本,此版本需要提供一个PasswordEncorder的实例,否则后台汇报错误:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
并且页面毫无响应。
因此,需要创建PasswordEncorder的实现类。
import org.springframework.security.crypto.password.PasswordEncoder;
public class MyPasswordEncoder implements PasswordEncoder {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}
@Override
public boolean matches(CharSequence charSequence, String s) {
return s.equals(charSequence.toString());
}
}
此类使用了最简单的明文密码作为测试。
在内存用户验证里添加
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder())
.withUser("admin").password("123456").roles("ADMIN","USER").and()
.withUser("user").password("111").roles("USER");
}
.passwordEncoder(new MyPasswordEncoder())。
这样,页面提交时候,密码以明文的方式进行匹配。
方式二:
使用Spring Security自带的PasswordEncoder的实现,比如:BCryptPasswordEncoder。
BCryptPasswordEncoder采用SHA-256 +随机盐+密钥对密码进行加密。
PasswordEncoder的实现类: