SecurityContextHolder实现原理(策略模式和ThreadLocal)

本文深入剖析了Spring Security中的SecurityContextHolder组件,它是保存认证信息的核心,利用策略模式和ThreadLocal实现线程安全的认证信息存储。讲解了SecurityContextHolder、SecurityContextHolderStrategy接口,特别是ThreadLocalSecurityContextHolderStrategy,以及ThreadLocal的工作原理,包括如何保存和获取线程局部变量。文章通过源码分析,帮助理解这两个技术在实际项目中的应用。
摘要由CSDN通过智能技术生成

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),当然也可以通过设置策略名,来指定自定义的策略
 */
	
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值