当前位置: 代码迷 >> 综合 >> SpringSecurity------ Storage Mechanisms(十)
  详细解决方案

SpringSecurity------ Storage Mechanisms(十)

热度:94   发布时间:2023-12-20 23:14:09.0

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中

  相关解决方案