SpringSecurity之SecurityContextHolder
介绍
SecurityContextHolder是SpringSecurity中保存认证信息的核心组件,重点是将给定的认证信息(SecurityContext)与当前执行线程关联。也就是说在同一个线程中可以通过该组件随时方便的获得认证信息。
简单来说,SecurityContextHolder是用来存储认证信息的,以方便保存用户的状态,供线程内所有方法使用SecurityContext,也就是用户信息。
SecurityContextHolder工作模式
SecurityContextHolder有三种实现模式,如下图所示
- MODE_THREADLOCAL(缺省工作模式)
- MODE_GLOBAL
- MODE_INHERITABLETHREADLOCAL
MODE_THREADLOCAL工作模式
默认情况下,SecurityContextHolder使用ThreadLocal机制来保存上下文信息,也就是说,只要使用者的逻辑执行都在一个线程中使用的话,其就可以在任何地方获得上下文信息。
此方式也是非常适合Servlet web应用,因为对于一个请求的处理,不管经历了多少Filter,都是在一个线程中进行的。但是对于不同的servlet request,使用的线程不一定是同一个线程(有一个线程的可能性,因为可能会从线程池中拿到同一个线程)
MODE_GLOBAL工作模式
数据保存在一个静态变量中,其存储载体是一个静态变量,可以在多线程环境下使用,但是用的比较少。
MODE_INHERITABLETHREADLOCAL工作模式
其存储载体为InheritableThreadLocal,InheritableThreadLocal继承ThreadLocal,多了一个特性,就是在创建子进程的时候,会自动的将父进程中的数据复制到子进程中去,实现了子进程能够获取父进程数据的功能。
SecurityContextHolder使用
获取当前用户的信息
-
获取securityContext,SecurityContextHolder的 getContext() 方法
SecurityContext securityContext = SecurityContextHolder.getContext();
-
从securityContext获取Authentication
Authentication authentication = securityContext.getAuthentication()
-
获取用户的信息,也就是UserDetails
UserDetails principal = (UserDetails)authentication.getPrincipal();
总结
SecurityContextHolder主要就是用于保存上下文,用于在一个线程中共享用户的信息,其有三种工作方式,最常用的工作方式就是ThreadLocal工作方式,主要应用在web应用中。