SpringSecurity之SecurityContextHolder详解

SpringSecurity之SecurityContextHolder

介绍

SecurityContextHolder是SpringSecurity中保存认证信息的核心组件,重点是将给定的认证信息(SecurityContext)与当前执行线程关联。也就是说在同一个线程中可以通过该组件随时方便的获得认证信息。

简单来说,SecurityContextHolder是用来存储认证信息的,以方便保存用户的状态,供线程内所有方法使用SecurityContext,也就是用户信息。

SecurityContextHolder工作模式

SecurityContextHolder有三种实现模式,如下图所示

  1. MODE_THREADLOCAL(缺省工作模式)
  2. MODE_GLOBAL
  3. MODE_INHERITABLETHREADLOCAL

SpringSecurity之SecurityContextHolder详解_第1张图片

MODE_THREADLOCAL工作模式

默认情况下,SecurityContextHolder使用ThreadLocal机制来保存上下文信息,也就是说,只要使用者的逻辑执行都在一个线程中使用的话,其就可以在任何地方获得上下文信息。

此方式也是非常适合Servlet web应用,因为对于一个请求的处理,不管经历了多少Filter,都是在一个线程中进行的。但是对于不同的servlet request,使用的线程不一定是同一个线程(有一个线程的可能性,因为可能会从线程池中拿到同一个线程)

MODE_GLOBAL工作模式

数据保存在一个静态变量中,其存储载体是一个静态变量,可以在多线程环境下使用,但是用的比较少。

MODE_INHERITABLETHREADLOCAL工作模式

其存储载体为InheritableThreadLocal,InheritableThreadLocal继承ThreadLocal,多了一个特性,就是在创建子进程的时候,会自动的将父进程中的数据复制到子进程中去,实现了子进程能够获取父进程数据的功能。

SecurityContextHolder使用

获取当前用户的信息
  1. 获取securityContext,SecurityContextHolder的 getContext() 方法

    SecurityContext securityContext = SecurityContextHolder.getContext();
    
  2. 从securityContext获取Authentication

    Authentication authentication = securityContext.getAuthentication()
    
  3. 获取用户的信息,也就是UserDetails

    UserDetails principal = (UserDetails)authentication.getPrincipal();
    

总结

SecurityContextHolder主要就是用于保存上下文,用于在一个线程中共享用户的信息,其有三种工作方式,最常用的工作方式就是ThreadLocal工作方式,主要应用在web应用中。

欢迎大家访问我的个人博客!!!

个人博客地址

你可能感兴趣的:(学习总结,java,spring,boot)