SecurityContextHolder:
簡(jiǎn)述:用來(lái)存儲(chǔ)應(yīng)用程序安全上下文詳細(xì)信息截珍。
其中最重要的方法就是initialize()识补,默認(rèn)使用的存儲(chǔ)策略是MODE_THREADLOCAL矿瘦,當(dāng)然也可指定其他方式仓犬。見(jiàn)源碼:
private static void initialize() {
if (!StringUtils.hasText(strategyName)) {
strategyName = "MODE_THREADLOCAL";
}
if (strategyName.equals("MODE_THREADLOCAL")) {
strategy = new ThreadLocalSecurityContextHolderStrategy();
} else if (strategyName.equals("MODE_INHERITABLETHREADLOCAL")) {
strategy = new InheritableThreadLocalSecurityContextHolderStrategy();
} else if (strategyName.equals("MODE_GLOBAL")) {
strategy = new GlobalSecurityContextHolderStrategy();
} else {
try {
Class<?> clazz = Class.forName(strategyName);
Constructor<?> customStrategy = clazz.getConstructor();
strategy = (SecurityContextHolderStrategy)customStrategy.newInstance();
} catch (Exception var2) {
ReflectionUtils.handleReflectionException(var2);
}
}
++initializeCount;
}
如何修改其存儲(chǔ)策略呢锰镀,從源碼一窺究竟:
private static String strategyName = System.getProperty("spring.security.strategy");
public static void setStrategyName(String strategyName) {
strategyName = strategyName;
initialize();
}
至于可修改的存儲(chǔ)策略有哪些呢兄纺?從第一段源碼中可知废菱,支持系統(tǒng)已有的(MODE_THREADLOCAL技矮、MODE_INHERITABLETHREADLOCAL、MODE_GLOBAL)和自定義兩種方式殊轴。大多數(shù)應(yīng)用使用默認(rèn)的存儲(chǔ)策略衰倦。如何修改其存儲(chǔ)策略呢?從第一段源碼可看出有兩種方式:①直接指定spring.security.strategy屬性旁理;②就是調(diào)用setStrategyName()樊零。
如何獲取當(dāng)前用戶(hù)的信息:
SecurityContextHolder用Authentication來(lái)存儲(chǔ)詳細(xì)的主體信息∧跷模可通過(guò)以下代碼在任何地方獲取通過(guò)驗(yàn)證的用戶(hù)名稱(chēng):
Object principal = SecurityContextHolder.getContext()驻襟。getAuthentication()。getPrincipal();
if(principal instanceof UserDetails){
String username =((UserDetails)principal).getUsername();
} else {
String username = principal.toString();
}
SecurityContextHolderStrategy:
簡(jiǎn)述:針對(duì)線(xiàn)程芋哭,存儲(chǔ)安全上下文信息的策略
SecurityContext:
簡(jiǎn)述:安全上下文沉衣,與當(dāng)前線(xiàn)程關(guān)聯(lián)的最小安全消息。
Authentication:
簡(jiǎn)述:表示一次認(rèn)證請(qǐng)求的token减牺,或者一個(gè)經(jīng)過(guò)認(rèn)證的主體(principal)豌习。
如何認(rèn)證?交由AuthenticationManager的authenticate()處理烹植。
一旦經(jīng)過(guò)認(rèn)證斑鸦,Authentication會(huì)存儲(chǔ)在一個(gè)thread-local的SecurityContext中。
屬性authenticated:除非將此屬性設(shè)為true草雕,否則它在遇到任何安全攔截器仍將需要經(jīng)過(guò)認(rèn)證