首页 > 其他分享 >【第七篇】SpringSecurity核心组件和核心过滤器

【第七篇】SpringSecurity核心组件和核心过滤器

时间:2024-06-14 18:03:00浏览次数:18  
标签:SecurityContext 对象 核心 SpringSecurity 第七篇 Authentication boolean UserDetails

一、SpringSecurity中的核心组件

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

jar 作用
spring-security-core SpringSecurity的核心jar包,认证和授权的核心代码都在这里面
spring-security-config 如果使用SpringSecurity XML命名空间进行配置或者SpringSecurity的<br />Java configuration支持,则需要它
spring-security-web 用于SpringSecurity 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中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;

}

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 getUsername();

	// 账号是否过期
	boolean isAccountNonExpired();

	// 是否锁定
	boolean isAccountNonLocked();

	// 凭证是否过期
	boolean isCredentialsNonExpired();

	// 账号是否可用
	boolean isEnabled();

}

这个接口的默认实现就是 User

image.png

这个UserDetails对象的来源是有一个特殊接口UserDetailsService,在这个接口中定义了一个loadUserByUsername的方法,接受一个用户名,来实现根据账号的查询操作,返回的是一个UserDetails对象。

public interface UserDetailsService {

	UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

}

UserDetailsService接口的实现有如下:

image.png

  Spring Security提供了许多 UserDetailsSerivice<

标签:SecurityContext,对象,核心,SpringSecurity,第七篇,Authentication,boolean,UserDetails
From: https://blog.csdn.net/weixin_43552143/article/details/139650644

相关文章

  • 核心(Hutool-core)工具类(社会信用代码工具-CreditCodeUtil)
    介绍法人和其他组织统一社会信用代码制度,相当于让法人和其他组织拥有了一个全国统一的“身份证号”。规则如下:第一部分:登记管理部门代码1位(数字或大写英文字母)第二部分:机构类别代码1位(数字或大写英文字母)第三部分:登记管理机关行政区划码6位(数字)第四部分:主体标识码(......
  • 核心(Hutool-core)工具类(信息脱敏工具-DesensitizedUtil)
    介绍在数据处理或清洗中,可能涉及到很多隐私信息的脱敏工作,因此Hutool针对常用的信息封装了一些脱敏方法。现阶段支持的脱敏数据类型包括:用户id中文姓名身份证号座机号手机号地址电子邮件密码中国大陆车牌,包含普通车辆、新能源车辆银行卡整体来说,所谓脱敏就是隐藏掉信......
  • 核心(Hutool-core)工具类(字符编码工具-CharsetUtil)
    介绍CharsetUtil主要针对编码操作做了工具化封装,同时提供了一些常用编码常量。常量常量在需要编码的地方直接引用,可以很好的提高便利性。字符串形式ISO_8859_1UTF_8GBKCharset对象形式CHARSET_ISO_8859_1CHARSET_UTF_8CHARSET_GBK方法编码字符串转为Charset对象Char......
  • 核心(Hutool-core)工具类(SPI加载工具-ServiceLoaderUtil)
    介绍SPI(ServiceProviderInterface),是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。更多介绍见:https://www.jianshu.com/p/3a3edbcd8f24使用定义一个接口:packagecn.hutool.test.spi;publicinterfaceSPIService......
  • 核心(Hutool-core)工具类(类加载工具-ClassLoaderUtil)
    介绍提供ClassLoader相关的工具类,例如类加载(Class.forName包装)等方法获取ClassLoadergetContextClassLoader获取当前线程的ClassLoader,本质上调用Thread.currentThread().getContextClassLoader()getClassLoader按照以下顺序规则查找获取ClassLoader:获取当前线程的Context......
  • 核心(Hutool-core)语言特性(HashMap扩展-Dict)
    由来如果你了解Python,你一定知道Python有dict这一数据结构,也是一种KV(Key-Value)结构的数据结构,类似于Java中的Map,但是提供了更加灵活多样的使用。Hutool中的Dict对象旨在实现更加灵活的KV结构,针对强类型,提供丰富的getXXX操作,将HashMap扩展为无类型区别的数据结构。介绍Dict继承H......
  • 核心(Hutool-core)语言特性(单例工具-Singleton)
    为什么会有这个类平常我们使用单例不外乎两种方式:在对象里加个静态方法getInstance()来获取。此方式可以参考【转】线程安全的单例模式(opensnewwindow)这篇博客,可分为饿汉和饱汉模式。通过Spring这类容器统一管理对象,用的时候去对象池中拿。Spring也可以通过配置决定懒汉......
  • 核心(Hutool-core)日期时间(计时器工具-TimeInterval)
    Hutool通过封装TimeInterval实现计时器功能,即可以计算方法或过程执行的时间。TimeInterval支持分组计时,方便对比时间。使用TimeIntervaltimer=DateUtil.timer();//---------------------------------//-------这是执行过程//---------------------------------timer.int......
  • 核心(Hutool-core)IO流相关(IO工具类-IoUtil)
    方法拷贝流的读写可以总结为从输入流读取,从输出流写出,这个过程我们定义为拷贝。这是一个基本过程,也是文件、流操作的基础。以文件流拷贝为例:BufferedInputStreamin=FileUtil.getInputStream("d:/test.txt");BufferedOutputStreamout=FileUtil.getOutputStream("d:/test......
  • 核心(Hutool-core)IO流相关
    由来IO的操作包括读和写,应用场景包括网络操作和文件操作。IO操作在Java中是一个较为复杂的过程,我们在面对不同的场景时,要选择不同的InputStream和OutputStream实现来完成这些操作。而如果想读写字符流,还需要Reader和Writer的各种实现类。这些繁杂的实现类,一方面给我们提供了更多......