需求缘起
上一节我们实现了默认单用户认证,这一节我们来实现通过基于内存配置多个用户认证信息,主要是为了方便进一步理解SpringSecurity 这个框架。
技术要点
通过 auth.inMemoryAuthentication() 对象配置用户身份信息。
编码
@Configuration
@EnableWebSecurity//开启Spring Security的功能
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//通过内存创建用户名和密码
auth.inMemoryAuthentication().withUser("user").password("123456").roles();
auth.inMemoryAuthentication().withUser("admin").password("123456").roles();
}
}
加密
以上的代码可以正常启动,但是输入用户名和密码后会出现异常:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
在 SpringSecurity 5.x 中,密码需要经过加密,也就是需要一个编码器 PasswordEncorder的实例。
有两种添加的方式
1. 通过 AuthenticationManagerBuilder 指定添加
修改以上代码
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//通过内存创建用户名和密码
auth.inMemoryAuthentication().withUser("user").password("123456").roles();
auth.inMemoryAuthentication()
.withUser("admin")
//指定编码器
.password(new BCryptPasswordEncoder().encode("123456"))
.roles();
}
2. 通过bean 指定编码器
在SecurityConfig 类中直接添加
@Bean
public PasswordEncoder passwordEncoder() {
//SpringSecurity 提供的一种编码器,我们也可以自己实现PasswordEncoder
return new BCryptPasswordEncoder();
}
最后整体代码如下(采用第二种加密方式):
@Configuration
@EnableWebSecurity//开启Spring Security的功能
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder() {
//SpringSecurity 提供的一种编码器,我们也可以自己实现PasswordEncoder
return new BCryptPasswordEncoder();
}
@Autowired
private PasswordEncoder passwordEncoder;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//通过内存创建用户名和密码
auth.inMemoryAuthentication().withUser("user").password(passwordEncoder.encode("123456")).roles();
auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder.encode("123456")).roles();
}
}
测试
重启应用,访问http://localhost:8080/hello测试即可