自定义UserDetailsManager
根据之前的图说明,UserDetails是由他管理的。所以我们自定义来覆盖
它有两个实现类:
我们简化问题,首先使用InMemoryUserDetailsManager。
@Configuration
public class SecurityConfig {
@Bean
public UserDetailsManager userDetailsManager(){
var udm = new InMemoryUserDetailsManager();
return udm;
}
}
当前还没有UserDetails
添加UserDetails
UserDetails接口的实现:
两个类,一个接口,我们使用第三个:User。
User有构造器提供我们使用,但更方便的是通过构建者对象构建
var uds = User.withUsername("dao")
.password("123")
.build();
让UserDetailsManager管理UserDetails
现在二者还没有联系,如何产生联系:
udm.createUser(uds);
授权错误
现在启动应用会报错:
Caused by: java.lang.IllegalArgumentException: Cannot pass a null GrantedAuthority collection
必须指定Authority。
指定授权
@Bean
public UserDetailsManager userDetailsManager(){
var udm = new InMemoryUserDetailsManager();
var uds = User.withUsername("dao")
.password("123")
.authorities("read")
.build();
udm.createUser(uds);
return udm;
}
现在启动不会有随机密码了,我们有自己指定的用户了。
密码编码错误
现在用 dao , 123登录会出现错误:
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id “null”
添加密码编码器
PasswordEncoder有许多实现者,我们先用最简单的(虽然已过时),原始密码不加密,这个仅仅用于实验阶段,不能使用在生产环境。
@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
现在登录则不会再报错了。
添加更多的用户
@Bean
public UserDetailsManager userDetailsManager(){
var udm = new InMemoryUserDetailsManager();
var uds = User.withUsername("dao")
.password("123")
.authorities("read")
.build();
var uds2 = User.withUsername("king")
.password("123")
.authorities("read","write")
.build();
udm.createUser(uds);
udm.createUser(uds2);
return udm;
}
现在你使用 king 123登录当然也是OK的。
源码
https://github.com/qiudaozhang/spring-security-learn002