核心组件之SecurityContextHolder


作用:保留系统当前的安全上下文细节,其中就包括当前使用系统的用户的信息。   上下文细节怎么表示?     用SecurityContext对象来表示   每个用户都会有它的上下文,那这个SecurityContext保存在哪里呢? 存储在一个SecurityContextHolder中,整个应用就一个SecurityContextHolder。   SecurityContextHolder存储SecurityContext的方式? 这要考虑到应用场景。 (1)单机系统,即应用从开启到关闭的整个生命周期只有一个用户在使用。由于整个应用只需要保存一个SecurityContext(安全上下文即可) (2)多用户系统,比如典型的Web系统,整个生命周期可能同时有多个用户在使用。这时候应用需要保存多个SecurityContext(安全上下文),需要利用ThreadLocal进行保存,每个线程都可以利用ThreadLocal获取其自己的SecurityContext,及安全上下文。   源码分析: SecurityContextHolder结构
ThreadLocalSecurityContextHolderStrategy.java(全部源码) 由源码可知,Authentication(认证信息),主要包含了以下内容
  • 用户权限集合 => 可用于访问受保护资源时的权限验证
  • 用户证书(密码) => 初次认证的时候,进行填充,认证成功后将被清空
  • 细节 => 暂不清楚,猜测应该是记录哪些保护资源已经验证授权,下次不用再验证,等等。
  • Pirncipal => 大概就是账号吧
  • 是否已认证成功