IT评测·应用市场-qidao123.com技术社区

标题: SpringSecurity5(13-核心组件和认证流程) [打印本页]

作者: 诗林    时间: 2025-4-7 16:05
标题: SpringSecurity5(13-核心组件和认证流程)
SecurityContextHolder

SecurityContextHolder 持有的是安全上下文的信息,当前操作的用户是谁,用户是否已经被认证,他拥有哪些角色权限等,这些都被保存在 SecurityContextHolder 中。SecurityContextHolder 默认利用 ThreadLocal 策略来存储认证信息,在 web 环境下,SpringSecurity 在用户登录时主动绑定认证信息到当前线程,在用户退出时,主动清除当前线程的认证信息
  1. public class SecurityContextHolder {
  2.     // 三种工作模式的定义,每种工作模式对应一种策略
  3.     public static final String MODE_THREADLOCAL = "MODE_THREADLOCAL";
  4.     public static final String MODE_INHERITABLETHREADLOCAL = "MODE_INHERITABLETHREADLOCAL";
  5.     public static final String MODE_GLOBAL = "MODE_GLOBAL";
  6.     // 类加载时首先尝试从环境属性中获取所指定的工作模式
  7.     public static final String SYSTEM_PROPERTY = "spring.security.strategy";       
  8.     private static String strategyName = System.getProperty(SYSTEM_PROPERTY);
  9.     private static SecurityContextHolderStrategy strategy;
  10.     // 初始化计数器, 初始为 0,
  11.     // 1. 类加载过程中会被初始化一次,此值变为 1
  12.     // 2. 此后每次调用 setStrategyName 会对新的策略对象执行一次初始化,相应的该值会增 1
  13.     private static int initializeCount = 0;
  14.     static {
  15.         initialize();
  16.     }
  17.     /**
  18.      * 清除上下文
  19.      */
  20.     public static void clearContext() {
  21.         strategy.clearContext();
  22.     }
  23.     /**
  24.      * 获取上下文
  25.      */
  26.     public static SecurityContext getContext() {
  27.         return strategy.getContext();
  28.     }
  29.     /**
  30.      * 获取计数器的值
  31.      */
  32.     public static int getInitializeCount() {
  33.         return initializeCount;
  34.     }
  35.     private static void initialize() {
  36.         if (!StringUtils.hasText(strategyName)) {
  37.             // Set default, 设置缺省工作模式/策略 MODE_THREADLOCAL
  38.             strategyName = MODE_THREADLOCAL;
  39.         }
  40.         if (strategyName.equals(MODE_THREADLOCAL)) {
  41.             strategy = new ThreadLocalSecurityContextHolderStrategy();
  42.         } else if (strategyName.equals(MODE_INHERITABLETHREADLOCAL)) {
  43.             strategy = new InheritableThreadLocalSecurityContextHolderStrategy();
  44.         } else if (strategyName.equals(MODE_GLOBAL)) {
  45.             strategy = new GlobalSecurityContextHolderStrategy();
  46.         } else {
  47.             // Try to load a custom strategy
  48.             try {
  49.                 Class<?> clazz = Class.forName(strategyName);
  50.                 Constructor<?> customStrategy = clazz.getConstructor();
  51.                 strategy = (SecurityContextHolderStrategy) customStrategy.newInstance();
  52.             }
  53.             catch (Exception ex) {
  54.                 ReflectionUtils.handleReflectionException(ex);
  55.             }
  56.         }
  57.         initializeCount++;
  58.     }
  59.     /**
  60.      * 设置上下文
  61.      */
  62.     public static void setContext(SecurityContext context) {
  63.         strategy.setContext(context);
  64.     }
  65.     /**
  66.      * 设置工作模式
  67.      */
  68.     public static void setStrategyName(String strategyName) {
  69.         SecurityContextHolder.strategyName = strategyName;
  70.         initialize();
  71.     }
  72.     /**
  73.      * 获取对应工作模式的策略
  74.      */
  75.     public static SecurityContextHolderStrategy getContextHolderStrategy() {
  76.         return strategy;
  77.     }
  78.     /**
  79.      * 创建空的上下文信息
  80.      */
  81.     public static SecurityContext createEmptyContext() {
  82.         return strategy.createEmptyContext();
  83.     }
  84.     public String toString() {
  85.         return "SecurityContextHolder[strategy='" + strategyName + "'; initializeCount="
  86.                 + initializeCount + "]";
  87.     }
  88. }
复制代码
SecurityContext

安全上下文,主要持有 Authentication 对象,如果用户未鉴权,那么 Authentication 对象将会是空的
  1. public interface SecurityContext extends Serializable {
  2.     /**
  3.      * 获取当前经过身份验证的主体,或身份验证请求令牌
  4.      */
  5.     Authentication getAuthentication();
  6.     /**
  7.      * 更改当前经过身份验证的主体,或删除身份验证信息
  8.      */
  9.     void setAuthentication(Authentication authentication);
  10. }
复制代码
Authentication

鉴权对象,该对象主要包含了用户的详细信息(UserDetails)和用户鉴权所必要的信息,如用户提交的用户名暗码、Remember-me Token 或 digest hash 值等,按不同鉴权方式利用不同的 Authentication 实现
[code]public interface Authentication extends Principal, Serializable {    //用来获取用户的权限。    Collection




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4