SecurityContextHolder实现原理
SecurityContextHolder是SpringSecurity中保存认证信息的核心组件,重点是将给定的认证信息(SecurityContext)与当前执行线程关联。也就是说在同一个线程中可以通过该组件随时方便的获得认证信息,基本操作
//保存认证信息
SecurityContextHolder.setContext(SecurityContextHolder.createEmptyContext());
//获得认证信息
SecurityContextHolder.getContext().getAuthentication()
一、核心组件
1.1 SecurityContextHolder
SecurityContextHolder源码如下,为方便阅读,增加中文注释:
package org.springframework.security.core.context;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Constructor;
/**
* 将给定的SecurityContext与当前执行线程关联。该类的提供了一系列的静态方法,真正的实现者,均交由org.springframework.security.core.context.SecurityContextHolderStrategy的实现类来完成
*/
public class SecurityContextHolder {
// ~ Static fields/initializers
// =====================================================================================
public static final String MODE_THREADLOCAL = "MODE_THREADLOCAL";
public static final String MODE_INHERITABLETHREADLOCAL = "MODE_INHERITABLETHREADLOCAL";
public static final String MODE_GLOBAL = "MODE_GLOBAL";
public static final String SYSTEM_PROPERTY = "spring.security.strategy";
private static String strategyName = System.getProperty(SYSTEM_PROPERTY);
//被委托者,采用策略模式
private static SecurityContextHolderStrategy strategy;
private static int initializeCount = 0;
//当类进行加载的时候,需要进行初始化操作
static {
initialize();
}
// ~ Methods
// ========================================================================================================
/**
* 从当前线程显式清除上下文值。
*/
public static void clearContext() {
strategy.clearContext();
}
/**
* 从当前线程获得上下文值。值非空
*/
public static SecurityContext getContext() {
return strategy.getContext();
}
/**
* 主要用于故障排除目的,此方法显示的次数已重新初始化SecurityContextHolderStrategy的次数
* 默认返回1
*/
public static int getInitializeCount() {
return initializeCount;
}
/**
该初始化方法就是实例化策略对象SecurityContextHolderStrategy
security内置三种策略来操作认证信息(SecurityContext),当然也可以通过设置策略名,来指定自定义的策略
*/