Ser competente en spring-security2 desde el código fuente

Consulte el maestro superior de la estación b: Portal

innovador:

Revise el capítulo anterior : el nivel superior es un filtro
Proceso de Spring Security: FilterChainProxy->determinar un SecurityFilterChain de acuerdo con la solicitud (llame a su método de coincidencias uno por uno para que coincida con si la solicitud se puede procesar)->ejecutar una serie de filtros en la cadena de filtros de seguridad

Cosas relacionadas con FilterChainProxy.
La interfaz SecurityFilterChain se utiliza para configurar un FilterChainProxy

//Used to configure a FilterChainProxy.
public interface SecurityFilterChain {
    
    

	boolean matches(HttpServletRequest request);
	List<Filter> getFilters();

}

SecurityConfigurer, AbstractConfiguredSecurityBuilder
AbstractConfiguredSecurityBuilder mencionado en el capítulo anterior, implementa indirectamente SecurityBuilder.

Configurador de seguridad

SecurityConfigurer se utiliza para configurar un SecurityBuilder

/**
Allows for configuring a SecurityBuilder. All SecurityConfigurer first have their init(SecurityBuilder) method invoked. After all init(SecurityBuilder) methods have been invoked, each configure(SecurityBuilder) method is invoked.
*/
//所有的SecurityConfigurer都首先调用它的init(SecurityBuilder) 方法
public interface SecurityConfigurer<O, B extends SecurityBuilder<O>>{
    
    
// 初始化方法 初始化一个SecurityBuilder
void init(B builder) throws Exception;
// 配置方法
void configure(B builder) throws Exception;
}

1. SecurityConfigurer es para configurar un SecurityBuilder.
2. SecurityBuilder es
el último en construir objetos: tiene bastantes subclases

AbstractConfiguredSecurityBuilder

Es una implementación indirecta de SecurityBuilder
1. Configuración de objetos compartidos
2. Inicialización del control (antes, durante y después de la inicialización, antes, durante y después de la configuración)

ResumenSeguridadBuilder

Lo que hace es permitir solo una compilación.

public abstract class AbstractSecurityBuilder<O> implements SecurityBuilder<O>{
    
    
       private AtomicBoolean building = new AtomicBoolean();
       
       public final O build() throws Exception {
    
    
		if (this.building.compareAndSet(false, true)) {
    
    
			this.object = doBuild();
			return this.object;
		}
		throw new AlreadyBuiltException("This object has already been built");
	}
}

聊回AbstractConfiguredSecurityBuilder

(Porque es una clase que participará en la construcción de objetos de seguridad)
Sabemos que SecurityBuilder se usa para construir objetos, este objeto puede ser una cadena de filtros de seguridad SecurityFilterChain, o puede ser un AuthenticationManager (administrador de autenticación).

Atributos

//AbstractConfiguredSecurityBuilder需要被一堆的SecurityConfigurer去配置,所以需要维护一个configurers
private final LinkedHashMap<Class<? extends SecurityConfigurer<O, B>>, List<SecurityConfigurer<O, B>>> configurers = new LinkedHashMap<>();
//
private final List<SecurityConfigurer<O, B>> configurersAddedInInitializing = new ArrayList<>();

// 共享对象
private final Map<Class<?>, Object> sharedObjects = new HashMap<>();
//同一个configure是否允许出现两个
private final boolean allowConfigurersOfSameType;
//后置处理
private ObjectPostProcessor<Object> objectPostProcessor;

método más utilizado

Cuando usamos spring-security, a menudo usamos .XXX para llamar a este método
y agregarle un SecurityConfigurer

private <C extends SecurityConfigurer<O, B>> void add(C configurer) {
    
    
		Assert.notNull(configurer, "configurer cannot be null");

		Class<? extends SecurityConfigurer<O, B>> clazz = (Class<? extends SecurityConfigurer<O, B>>) configurer
				.getClass();
				// 同步 只允许一个线程工作。configurers 一个LinkedHashMap
		synchronized (configurers) {
    
    
		//BuildState是一个枚举类 状态:未构建、初始化、配置、构建中、构建完成
			if (buildState.isConfigured()) {
    
    //是否已经配置
			//已经构建过了 不需要再应用
				throw new IllegalStateException("Cannot apply " + configurer
						+ " to already built object");
			}
			List<SecurityConfigurer<O, B>> configs = allowConfigurersOfSameType ? this.configurers
					.get(clazz) : null;
			if (configs == null) {
    
    
				configs = new ArrayList<>(1);
			}
			// 添加
			configs.add(configurer);
			this.configurers.put(clazz, configs);
			// 是否正在初始化
			if (buildState.isInitializing()) {
    
    
			//
				this.configurersAddedInInitializing.add(configurer);
			}
		}
	}

Supongo que te gusta

Origin blog.csdn.net/qq_43566782/article/details/129372130
Recomendado
Clasificación