概述
介绍
InMemoryUserDetailsManagerConfigurer
是Spring Security Config
提供的一个安全配置器SecurityConfigurer
,用来配置一个安全构建器ProviderManagerBuilder
(通常可以认为就是AuthenticationManagerBuilder
),它为目标安全构建器提供的是一个基于内存存储用户账号详情的用户账号详情管理对象DaoAuthenticationProvider
。
具体来讲,InMemoryUserDetailsManagerConfigurer
实现了接口SecurityConfigurer
,它的主要配置动作是:
- 创建一个
InMemoryUserDetailsManager
(UserDetailsManager/UserDetailsService
的一个实现类); - 创建一个
DaoAuthenticationProvider
,将上面所创建的InMemoryUserDetailsManager
作为自己的UserDetailsService userDetailsService
属性; - 将上面所创建的
DaoAuthenticationProvider
添加到目标构建器ProviderManagerBuilder
上。
另外,因为InMemoryUserDetailsManagerConfigurer
继承自UserDetailsManagerConfigurer
,所以UserDetailsManagerConfigurer
所具备的能力,InMemoryUserDetailsManagerConfigurer
都拥有。
注意 :
InMemoryUserDetailsManagerConfigurer
和所提供的InMemoryUserDetailsManager
主要应用于开发调试环境,其设计目的主要是测试和功能演示,一般不在生产环境中使用。
继承关系
使用
// 通常开发人员的WebSecurityConfigurerAdapter实现类在方法
// public void configure(AuthenticationManagerBuilder builder) throws Exception 中有如下调用 :
// 这里 builder 是 AuthenticationManagerBuilder
// 1. 应用了 InMemoryUserDetailsManagerConfigurer
// 2. 创建用户账号 admin/123, 密码采用明文保存,角色 ADMIN
// 3. 创建用户账号 root/123, 密码采用明文保存,角色为 ROOT
builder.inMemoryAuthentication().withUser("admin").password("{noop}123").roles("ADMIN").and()
.withUser("root").password("{noop}123").roles("ROOT");
源代码
源代码版本 Spring Security Config 5.1.4.RELEASE
package org.springframework.security.config.annotation.authentication.configurers.provisioning;
import java.util.ArrayList;
import org.springframework.security.config.annotation.authentication.ProviderManagerBuilder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
/**
* Configures an
* org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder
* to have in memory authentication. It also allows easily adding users to the in memory
* authentication.
*
* @param <B> the type of the ProviderManagerBuilder that is being configured
*
* @author Rob Winch
* @since 3.2
*/
public class InMemoryUserDetailsManagerConfigurer<B extends ProviderManagerBuilder<B>>
extends UserDetailsManagerConfigurer<B, InMemoryUserDetailsManagerConfigurer<B>> {
/**
* Creates a new instance
*/
public InMemoryUserDetailsManagerConfigurer() {
super(new InMemoryUserDetailsManager(new ArrayList<>()));
}
}
从源代码可见,InMemoryUserDetailsManagerConfigurer
只提供了一个缺省构造函数,确定目标UserDetailsManager
是一个InMemoryUserDetailsManager
,并且不包含任何用户详情。真正需要被管理的用户详情会在配置过程中设置。除此之外,InMemoryUserDetailsManagerConfigurer
的主要能力,体现在其基类UserDetailsManagerConfigurer
。