SecurityContextHolder解析

作用:保留系统当前的安全上下文细节,其中就包括当前使用系统的用户信息。
每个用户都有自己的SecurityContext,存储在一个SecurityContextHolder中,整个应用就一个SecurityContextHolder。

SecurityContextHolder存储SecurityContext的方式:
1 单机系统:应用从开启到关闭的整个生命周期只有一个用户在使用。由于整个应用只需要保存一个SecurityContext(安全上下文即可)。
2 多用户系统,比如典型的Web系统,整个生命周期可能同时有多个用户在使用。这时候应用需要保存多个SecurityContext(安全上下文),需要利用ThreadLocal进行保存,每个线程都可以利用ThreadLocal获取其自己的SecurityContext,及安全上下文。

SecurityContextHolder
SecurityContextHolder解析_第1张图片
SecurityContextHolder利用了一个SecurityContextHolderStrategy(存储策略)进行上下文的存储。
SecurityContestHolderStrategy.java
SecurityContextHolder解析_第2张图片
SecurityContextHolderStrategy只是一个接口,这个接口提供创建,清空,获取,设置上下文的操作。以下是其实现类和存储策略。
SecurityContextHolder解析_第3张图片

GlobalSecurityContextHolderStrategy(全部源码)
全局的上下文存取策略,只存储一个上下文,对应前面说的单机系统。
ThreadLocalSecurityContextHolderStrategy基于ThreadLocal的存储策略的实现,ThreadLocal实际上用数组存储多个SecurityCentext上下文对象。原理是,ThreadLocal会为每个线程开辟一个存储区域,来存储相应的对象。

Authentication:用户信息的表示,SecurityContextHolder存储了当前与系统交互的用户信息。Principal(准则)=> 允许通过的规则,即允许访问的规则,基本等价于UserDetails(用户信息)。SecurityContext只保存了Authentication的信息。
在这里插入图片描述
SecurityContextHolder解析_第4张图片

Authenticatioin中包含了如下信息:
Authorities用户权限集合:可用于访问受保护资源时的权限验证
Credentials:证明委托人的凭据是正确的。这通常是一个密码,但可以是与Authentication Manager相关的任何内容。调用者被期望填充凭证。
Details细节:存储有关身份验证请求的其他详细信息。这些可能是ip地址、证书序列号等。
Pirncipal:被认证主体的身份。对于具有用户名和密码的authentication request,这就是用户名。调用者将填充身份验证请求的主体。Authentication Manager实现通常会返回一个包含丰富信息的身份验证,作为应用程序使用的主体。许多身份验证提供者将创建一个UserDetails对象作为主体。
isAuthenticated:是否已认证成功。

参考:
https://www.cnblogs.com/longfurcat/p/9417912.html

你可能感兴趣的:(Spring,Security)