SecurityContextHolder:
简述:用来存储应用程序安全上下文详细信息。
其中最重要的方法就是initialize(),默认使用的存储策略是MODE_THREADLOCAL,当然也可指定其他方式。见源码:
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;
}
如何修改其存储策略呢,从源码一窥究竟:
private static String strategyName = System.getProperty("spring.security.strategy");
public static void setStrategyName(String strategyName) {
strategyName = strategyName;
initialize();
}
至于可修改的存储策略有哪些呢?从第一段源码中可知,支持系统已有的(MODE_THREADLOCAL、MODE_INHERITABLETHREADLOCAL、MODE_GLOBAL)和自定义两种方式。大多数应用使用默认的存储策略。如何修改其存储策略呢?从第一段源码可看出有两种方式:①直接指定spring.security.strategy属性;②就是调用setStrategyName()。
如何获取当前用户的信息:
SecurityContextHolder用Authentication来存储详细的主体信息。可通过以下代码在任何地方获取通过验证的用户名称:
Object principal = SecurityContextHolder.getContext()。getAuthentication()。getPrincipal();
if(principal instanceof UserDetails){
String username =((UserDetails)principal).getUsername();
} else {
String username = principal.toString();
}
SecurityContextHolderStrategy:
简述:针对线程,存储安全上下文信息的策略
SecurityContext:
简述:安全上下文,与当前线程关联的最小安全消息。
Authentication:
简述:表示一次认证请求的token,或者一个经过认证的主体(principal)。
如何认证?交由AuthenticationManager的authenticate()处理。
一旦经过认证,Authentication会存储在一个thread-local的SecurityContext中。
属性authenticated:除非将此属性设为true,否则它在遇到任何安全拦截器仍将需要经过认证
网友评论