作用:保留系统当前的安全上下文细节,其中就包括当前使用系统的用户的信息。
 
上下文细节怎么表示?
    用SecurityContext对象来表示
 
每个用户都会有它的上下文,那这个SecurityContext保存在哪里呢?
存储在一个SecurityContextHolder中,整个应用就一个SecurityContextHolder。
 
SecurityContextHolder存储SecurityContext的方式?
这要考虑到应用场景
(1)单机系统,即应用从开启到关闭的整个生命周期只有一个用户在使用。由于整个应用只需要保存一个SecurityContext(安全上下文即可)
(2)多用户系统,比如典型的Web系统,整个生命周期可能同时有多个用户在使用。这时候应用需要保存多个SecurityContext(安全上下文),需要利用ThreadLocal进行保存,每个线程都可以利用ThreadLocal获取其自己的SecurityContext,及安全上下文。
 
源码分析:
SecurityContextHolder结构

SecurityContextHolder.java(部分源码)

由源码可知,SecurityContextHolder利用了一个SecurityContextHolderStrategy(存储策略)进行上下文的存储。我们来看看SecurityContestHolderStrategy,到底是什么
 
SecurityContestHolderStrategy.java(全部源码)

可知 SecurityContestHolderStrategy只是一个接口,这个接口提供创建、清空、获取、设置上下文的操作。那它有哪些实现类呢,也就是有哪些存储策略呢?
 
GlobalSecurityContextHolderStrategy.java(全部源码)
全局的上下文存取策略,只存储一个上下文,对应前面说的单机系统。
 

ThreadLocalSecurityContextHolderStrategy.java(全部源码)

基于ThreadLocal的存储策略实现,看上去,这个类好像跟上面那个全局的没什么差别。但是要注意了,它是用ThreadLocal来存储的。新手可能会疑惑,就一个变量,我怎么存储多个上下文,这个变量又不是集合。
这里就不分析源码了,实际上ThreadLocal内部会用数组来存储多个对象的。原理是,ThreadLocal会为每个线程开辟一个存储区域,来存储相应的对象。
 
Authentication——用户信息的表示:
    在SecurityContextHolder中存储了当前与系统交互的用户的信息。Spring Security使用一个Authentication 对象来表示这些信息。一般不需要自己创建这个对象,但是查找这个对象的操作对用户来说却非常常见。

批注:
    ①Principal(准则)=> 允许通过的规则,即允许访问的规则,基本等价于UserDetails(用户信息)
 
源码分析:
我们来看看,这个SecurityContext(安全上下文),到底是个什么样子。
SecurityContext.java(全部源码)

由源码可知,所谓的安全上下文,只是保存了Authentication(认证信息)。那认证信息包含哪些内容呢?
 
Authentication.java(全部源码)

由源码可知,Authentication(认证信息),主要包含了以下内容
  • 用户权限集合 => 可用于访问受保护资源时的权限验证
  • 用户证书(密码) => 初次认证的时候,进行填充,认证成功后将被清空
  • 细节 => 暂不清楚,猜测应该是记录哪些保护资源已经验证授权,下次不用再验证,等等。
  • Pirncipal => 大概就是账号吧
  • 是否已认证成功
 
 

核心组件之SecurityContextHolder的更多相关文章

  1. Spring Security 入门原理及实战

    目录 从一个Spring Security的例子开始 创建不受保护的应用 加入spring security 保护应用 关闭security.basic ,使用form表单页面登录 角色-资源 访问控 ...

  2. springSecurity总结

    springSecurity总结: 一.Spring security框架简介   1.简介           一个能够为基于Spring的企业应用系统提供声明式的安全訪问控制解决方式的安全框架(简 ...

  3. spring security简介与使用

    目录 spring security 新建一个springboot项目 添加spring security 登录 使用默认用户和随机生成的密码登录 使用yaml文件定义的用户名.密码登录 使用代码中指 ...

  4. Spring Security(1):认证和授权的核心组件介绍及源码分析

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方式的安全框架.它包括认证(Authentication)和授权(Authorization)两个部 ...

  5. SpringBoot Spring Security 核心组件 认证流程 用户权限信息获取详细讲解

    前言 Spring Security 是一个安全框架, 可以简单地认为 Spring Security 是放在用户和 Spring 应用之间的一个安全屏障, 每一个 web 请求都先要经过 Sprin ...

  6. spring源码:核心组件(li)

    一.AOP实现 Spring代理对象的产生:代理的目的是调用目标方法时我们可以转而执行InvocationHandler类的invoke方法,所以如何在InvocationHandler上做文章就是S ...

  7. 我心中的核心组件(可插拔的AOP)~大话开篇及目录

    回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是我认为在项目中比较常用的功能,如日志,异常处理,消息,邮件,队列服务,调度,缓存,持久化,分布式文件存储,NoSQL存储,IoC容器,方法 ...

  8. Hadoop的核心组件和生态圈

    摘要:Hadoop是一个由Apache基金会所开发的分布式系统基础架构.Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,则MapReduce为海量的数 ...

  9. 我心中的核心组件~MSMQ与Redis队列

    回到目录 这个文章其实是我心中的核心组件的第七回,确实在时间上有些滞后了,但内容并不滞后!本文MSMQ只是个引题,我确实不太想说它,它是微软自己集成的一套消息队列,寄宿在Window服务里,稳定性十在 ...

随机推荐

  1. Codeforces791A Bear and Big Brother

    A. Bear and Big Brother time limit per test 1 second memory limit per test 256 megabytes input stand ...

  2. UniGUI的TUniLoginForm窗口自定义背景色和背景图片

    雨田家园 UniGUI的TUniLoginForm窗口自定义背景色 uniGUI的TUniLoginForm类创建的登录窗口默认是不带颜色,可以自定义css风格来改变背景颜色. 一般是通过在UniSe ...

  3. 利用Delphi编程控制摄像头(图)

    你的电脑有没有摄像头?看到别人用QQ玩视屏你会不会去想怎么实现的?这里介绍使用DELPHI使用MS的 AVICAP32.DLL就可轻松的实现对摄像头编程,如果再加上你的网络编程水平,实现一个视屏聊天就 ...

  4. 有关VS报错Files的值XXX

    从网上下载了一个实例来学习,但是运行的时候报错:Files的值(后面跟一堆符号,看不懂), 环境:安装了易赛通加密软件(估计可能跟这个加密软件有关系了) 解决方案:找到程序根目录的obj/Debug/ ...

  5. AlexNet详解

    在imagenet上的图像分类challenge上Alex提出的alexnet网络结构模型赢得了2012届的冠军.要研究CNN类型DL网络模型在图像分类上的应用,就逃不开研究alexnet,这是CNN ...

  6. ICCV2013、CVPR2013、ECCV2013目标检测相关论文

    CVPapers 网址: http://www.cvpapers.com/   ICCV2013 Papers about Object Detection: 1. Regionlets for Ge ...

  7. SQLSERVER CXPACKET 等待

    --SQLSERVER CXPACKET 等待 2013-6-11 2 --联机丛书: 3 --当尝试同步查询处理器交换迭代器时出现.如果针对该等待类型的争用成为问题时,可以考虑降低并行度 4 5 6 ...

  8. ajax调用WebMethed返回处理请求时出错

    ajax post调用WebMethed报错,返回的信息如下: {“Message”:“处理请求时出错”,“StackTrace”:“”,“ExceptionType”:“”} 查了一下WebMeth ...

  9. 背水一战 Windows 10 (57) - 控件(集合类): ListViewBase - 增量加载, 分步绘制

    [源码下载] 背水一战 Windows 10 (57) - 控件(集合类): ListViewBase - 增量加载, 分步绘制 作者:webabcd 介绍背水一战 Windows 10 之 控件(集 ...

  10. 一个docker容器中运行多个服务还是弄一堆docker容器运行?

    不建议直接在单个 Docker 容器中运行多个程序. 以 2017年 10 月18 日 Docker 官方支持 Kubernetes 为分水岭计算,Kubernetes 赢得容器编排之战的最终胜利已经 ...