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