当前位置: 首页 > article >正文

SpringSecurity核心过滤器-SecurityContextPersistenceFilter

一、SpringSecurity中的核心组件

  在SpringSecurity中的jar分为4个,作用分别为

jar 作用
spring-security-core SpringSecurity的核心jar包,认证和授权的核心代码都在这里面
spring-security-config 如果使用Spring Security XML名称空间进行配置或Spring Security的<br />Java configuration支持,则需要它
spring-security-web 用于Spring Security web身份验证服务和基于url的访问控制
spring-security-test 测试单元

1.SecurityContextHolder

  首先来看看在spring-security-core中的SecurityContextHolder,这个是一个非常基础的对象,存储了当前应用的上下文SecurityContext,而在SecurityContext可以获取Authentication对象。也就是当前认证的相关信息会存储在Authentication对象中。

image.png

  默认情况下,SecurityContextHolder是通过 ThreadLocal来存储对应的信息的。也就是在一个线程中我们可以通过这种方式来获取当前登录的用户的相关信息。而在SecurityContext中就只提供了对Authentication对象操作的方法

public interface SecurityContext extends Serializable {
   

	Authentication getAuthentication();

	void setAuthentication(Authentication authentication);

}

xxxStrategy的各种实现

image.png

策略实现 说明
GlobalSecurityContextHolderStrategy 把SecurityContext存储为static变量
InheritableThreadLocalSecurityContextStrategy 把SecurityContext存储在InheritableThreadLocal中<br />InheritableThreadLocal解决父线程生成的变量传递到子线程中进行使用
ThreadLocalSecurityContextStrategy 把SecurityContext存储在ThreadLocal中

2.Authentication

  Authentication是一个认证对象。在Authentication接口中声明了如下的相关方法。

public interface Authentication extends Principal, Serializable {
   

	// 获取认证用户拥有的对应的权限
	Collection<? extends GrantedAuthority> getAuthorities();

	// 获取哦凭证
	Object getCredentials();

    // 存储有关身份验证请求的其他详细信息。这些可能是 IP地址、证书编号等
	Object getDetails();

     // 获取用户信息 通常是 UserDetails 对象
	Object getPrincipal();

    // 是否认证
	boolean isAuthenticated();

    // 设置认证状态
	void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;

}

image.png

  基于上面讲解的三者的关系我们在项目中如此来获取当前登录的用户信息了。

    public String hello(){
   
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        Object principal = authentication.getPrincipal();
        if(principal instanceof UserDetails){
   
            UserDetails userDetails = (UserDetails) principal;
            System.out.println(userDetails.getUsername());
            return "当前登录的账号是:" + userDetails.getUsername();
        }
        return "当前登录的账号-->" + principal.toString();
    }

  调用 getContext()返回的对象是 SecurityContext接口的一个实例,这个对象就是保存在线程中的。接下来将看到,Spring Security中的认证大都返回一个 UserDetails的实例作为principa。

3.UserDetailsService

  在上面的关系中我们看到在Authentication中存储当前登录用户的是Principal对象,而通常情况下Principal对象可以转换为UserDetails对象。UserDetails是Spring Security中的一个核心接口。它表示一个principal,但是是可扩展的、特定于应用的。可以认为 UserDetails是数据库中用户表记录和Spring Security在 SecurityContextHolder中所必须信息的适配器。

public interface UserDetails extends Serializable {
   

	// 对应的权限
	Collection<? extends GrantedAuthority> getAuthorities();

	// 密码
	String getPassword();

	// 账号
	String 

http://www.kler.cn/a/562603.html

相关文章:

  • uniapp写的h5跳转小程序
  • LabVIEW 中 codeGenEngine.llb 工具库
  • 【c语言】字符函数和字符串函数(1)
  • 【SpringBoot】——分组校验、自定义注解、登入验证(集成redis)、属性配置方式、多环境开发系统学习知识
  • llaMa模型的创新
  • Mobaxterm服务器常用命令(持续更新)
  • 6.3 - UART串口数据发送之中断
  • Snapshot Compressed Imaging:打破传统成像的新视界
  • 接口测试-计算机网络基础扫盲
  • Linux | man 手册使用详解
  • 关于远程连接工具不能用hostname而只能用ip连接上的问题
  • flowable-ui 的会签功能实现
  • Hutool - Http:基于 HttpUrlConnection 的 Http 客户端封装
  • Vscode编辑器获取更新远程最新分支
  • DeepSeek 开源周:DeepEP 项目详解,GPU 压榨计划启动!
  • DeepSeek开源周首日:发布大模型加速核心技术可变长度高效FlashMLA 加持H800算力解码性能狂飙升至3000GB/s
  • 扩增子测序|R包microeco妙用之零模型计算群落确定性和随机性过程(NST,pNST,βNTI,RCbray生态过程计算)
  • 基于springboot的学习社区博客
  • DeepSeek回答:AI时代Go语言学习路线
  • 在 C++23 中使用智能指针进行现代内存管理 — 第 2 部分:共享指针