SpringSecurity------Storage Mechanisms(十)
- Storage Mechanisms
-
- 1、 In-Memory Authentication(内存模式)
- 2、JDBC Authentication(数据库模式)
- 3、DaoAuthenticationProvider
Storage Mechanisms
1、 In-Memory Authentication(内存模式)
InMemoryUserDetailsManager实现了UserDetailsService接口,支持从内存中检索认证信息用于用户名密码校验;同时,InMemoryUserDetailsManager还实现了UserDetailsManager接口,以便管理UserDetails。配置使用InMemoryUserDetailsManager 的方式:
@Bean
public UserDetailsService users() {
UserDetails user = User.builder().username("user").password("{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW").roles("USER").build();UserDetails admin = User.builder().username("admin").password("{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW").roles("USER", "ADMIN").build();return new InMemoryUserDetailsManager(user, admin);
}
另一种配置方式:
@Bean
public UserDetailsService users() {
UserBuilder users = User.withDefaultPasswordEncoder();UserDetails user = users.username("user").password("password").roles("USER").build();UserDetails admin = users.username("admin").password("password").roles("USER", "ADMIN").build();return new InMemoryUserDetailsManager(user, admin);
}
2、JDBC Authentication(数据库模式)
JdbcDaoImpl实现UserDetailsService接口,支持从数据库中检索认证信息用于用户名密码校验,同时,JdbcUserDetailsManager继承了JdbcDaoImpl ,以便提供对UserDetails的管理。
默认数据库脚本
JdbcDaoImpl需要一些数据库表用于存储用户名密码和一些用户的权限信息,默认的数据库脚本在org/springframework/security/core/userdetails/jdbc/users.ddl中
配置DataSource
在配置JdbcUserDetailsManager之前,我们必须创建一个数据源(DataSource)。在测试环境中,我们可以设置一个使嵌入式数据源(Embedded Data Source)用于初始化:
@Bean
DataSource dataSource() {
return new EmbeddedDatabaseBuilder().setType(H2).addScript("classpath:org/springframework/security/core/userdetails/jdbc/users.ddl").build();
}
配置JdbcUserDetailsManager
使用Spring Boot CLI将“password ”转换成密文形式
@Bean
UserDetailsManager users(DataSource dataSource) {
UserDetails user = User.builder().username("user").password("{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW").roles("USER").build();UserDetails admin = User.builder().username("admin").password("{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW").roles("USER", "ADMIN").build();JdbcUserDetailsManager users = new JdbcUserDetailsManager(dataSource);users.createUser(user);users.createUser(admin);
}
3、DaoAuthenticationProvider
DaoAuthenticationProvider是AuthenticationProvider的一个实现,它利用UserDetailsService和PasswordEncoder来验证用户名和密码。下图就是AuthenticationManager在读取用户名和密码的工作流程
(1)鉴权过滤器将读取的客户端用户名和密码封装成UsernamePasswordAuthenticationToken传递给ProviderManager
(2)ProviderManager被配置使用DaoAuthenticationProvider
(3)DaoAuthenticationProvider从UserDetailsService获取UserDetails
(4)DaoAuthenticationProvider使用PasswordEncoder和UserDetails验证用户名密码
(5)验证成功后返回UsernamePasswordAuthenticationToken,里面包含一个已经验证的主体信息,这个主体信息是通过UserDetailsService返回的。最终,UsernamePasswordAuthenticationToken将由鉴权过滤器设置到SecurityContextHolder中