当前位置:   article > 正文

SpringSecurity之SecurityContextHolder详解

securitycontextholder

SpringSecurity之SecurityContextHolder

介绍

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

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

SecurityContextHolder工作模式

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

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

在这里插入图片描述

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();
    
    • 1
  2. 从securityContext获取Authentication

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

    UserDetails principal = (UserDetails)authentication.getPrincipal();
    
    • 1
总结

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

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

个人博客地址

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/68905
推荐阅读
相关标签
  

闽ICP备14008679号