添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
英俊的罐头  ·  Spring Security 6 ...·  2 天前    · 
性感的大象  ·  在 WebLogic Workshop ...·  4 天前    · 
奔放的松树  ·  Sending Messages :: ...·  1 周前    · 
冷静的猴子  ·  toptoon.com.tw - ...·  3 周前    · 
爱听歌的领带  ·  磁力天堂 | ...·  3 月前    · 
腼腆的椅子  ·  Infolytica MagNet ...·  5 月前    · 

1. SpringSecurity 的过滤器介绍

SpringSecurity 采用的是责任链的设计模式,它有一条很长的过滤器链。现在对这条过滤
器链的 15 个过滤器进行说明:

  1. WebAsyncManagerIntegrationFilter:将 Security 上下文与 Spring Web 中用于
    处理异步请求映射的 WebAsyncManager 进行集成。

  2. SecurityContextPersistenceFilter:在每次请求处理之前将该请求相关的安全上
    下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将
    SecurityContextHolder 中关于这次请求的信息存储到一个“仓储”中,然后将
    SecurityContextHolder 中的信息清除,例如在 Session 中维护一个用户的安全信
    息就是这个过滤器处理的。

  3. HeaderWriterFilter:用于将头信息加入响应中。

  4. CsrfFilter:用于处理跨站请求伪造。

  5. LogoutFilter:用于处理退出登录。

  6. UsernamePasswordAuthenticationFilter:用于处理基于表单的登录请求,从表单中
    获取用户名和密码。默认情况下处理来自 /login 的请求。从表单中获取用户名和密码
    时,默认使用的表单 name 值为 username 和 password,这两个值可以通过设置这个
    过滤器的 usernameParameter 和 passwordParameter 两个参数的值进行修改。

  7. DefaultLoginPageGeneratingFilter:如果没有配置登录页面,那系统初始化时就会
    配置这个过滤器,并且用于在需要进行登录时生成一个登录表单页面。

  8. BasicAuthenticationFilter:检测和处理 http basic 认证。

  9. RequestCacheAwareFilter:用来处理请求的缓存。

  10. SecurityContextHolderAwareRequestFilter:主要是包装请求对象 request。

  11. AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在
    Authentication 对象,如果不存在为其提供一个匿名 Authentication。

  12. AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在
    Authentication 对象,如果不存在为其提供一个匿名 Authentication。

  13. AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在
    Authentication 对象,如果不存在为其提供一个匿名 Authentication。

  14. FilterSecurityInterceptor:可以看做过滤器链的出口。

  15. RememberMeAuthenticationFilter:当用户没有登录而直接访问资源时, 从 cookie
    里找出用户的信息, 如果 Spring Security 能够识别出用户提供的 remember me cookie,
    用户将不必填写用户名和密码, 而是直接登录进入系统,该过滤器默认不开启。

2.SpringSecurity 基本流程

Spring Security 采取过滤链实现认证与授权,只有当前过滤器通过,才能进入下一个
过滤器
在这里插入图片描述
绿色部分是认证过滤器,需要我们自己配置,可以配置多个认证过滤器。认证过滤器可以
使用 Spring Security 提供的认证过滤器,也可以自定义过滤器(例如:短信验证)。认
证过滤器要在 configure(HttpSecurity http)方法中配置,没有配置不生效。下面会重
点介绍以下三个过滤器:

  • UsernamePasswordAuthenticationFilter: 该过滤器会拦截前端提交的 POST 方式
    的登录表单请求,并进行身份认证。
  • ExceptionTranslationFilter 过滤器:该过滤器不需要我们配置,对于前端提交的请求会
    直接放行,捕获后续抛出的异常并进行处理(例如:权限访问限制)。
  • FilterSecurityInterceptor 过滤器:该过滤器是过滤器链的最后一个过滤器,根据资源
    权限配置来判断当前请求是否有权限访问对应的资源。如果访问受限会抛出相关异常,并
    由 ExceptionTranslationFilter 过滤器进行捕获和处理。

3.SpringSecurity 认证流程

认证流程是在 UsernamePasswordAuthenticationFilter 过滤器中处理的,具体流程如下
所示:
在这里插入图片描述

3.1 UsernamePasswordAuthenticationFilter 源码

当前端提交的是一个 POST 方式的登录表单请求,就会被该过滤器拦截,并进行身份认证。该过滤器的 doFilter() 方法实现在其抽象父类

AbstractAuthenticationProcessingFilter 中,查看相关源码
AbstractAuthenticationProcessingFilter .doFilter()
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

子类的UsernamePasswordAuthenticationFilter.attemptAuthentication():

查看如何设置为未认证状态:

在这里插入图片描述
查看一下最后的确认为认证状态的源码:

在这里插入图片描述
为一个接口, 查看它的实现类: ProviderManager

ProviderManager AuthenticationManager 接口的实现类,该接口是认证相关的核心接口,也是认证的入口。在实际开发中,我们可能有多种不同的认证方式,例如:用户名+密码、邮箱+密码、手机号+验证码等,而这些认证方式的入口始终只有一个,那就是AuthenticationManager。在该接口的常用实现类 ProviderManager 内部会维护一个List列表,存放多种认证方式,实际上这是委托者模式, 代理模式。

每种认证方式对应着一个 AuthenticationProvider,AuthenticationManager 根据认证方式的不同(根据传入的 Authentication 类型判断)委托对应的 AuthenticationProvider 进行用户认证。

在这里插入图片描述
在这里插入图片描述
调用DaoAuthenticationProvider和UserDetialsService进行关联, 返回UserDetial, 于是认证成功。

这里还存在如果认证成功了的话, 会去除result的敏感信息:

调用 CredentialsContainer 接口定义的eraseCredentials() 方法去除敏感信息。查看UsernamePasswordAuthenticationToken 实现的 eraseCredentials() 方法,该方法实现在其父类中:

	@Override
	public void eraseCredentials() {
		super.eraseCredentials();
		credentials = null;
	public void eraseCredentials() {
		eraseSecret(getCredentials());
		eraseSecret(getPrincipal());
		eraseSecret(details);

在这里插入图片描述
下面的图为整个认证的大致过程(包含实现和委托和关联和依赖的关系)
在这里插入图片描述

SpringSecurity 原理总结1. SpringSecurity 的过滤器介绍SpringSecurity 采用的是责任链的设计模式,它有一条很长的过滤器链。现在对这条过滤器链的 15 个过滤器进行说明:WebAsyncManagerIntegrationFilter:将 Security 上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成。SecurityContextPersistenceFilter:在每次请求处理之前将该请求
yshop基于当前流行技术组合的前后端分离商城系统: SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue的前后端分离的商城系统, 包含分类、sku、运费模板、素材库、小程序直播、拼团、砍价、商户管理、 秒杀、优惠券、积分、分销、会员、充值、多门店等功能,更适合企业或个人二次开发; yshop基于当前流行技术组合的前后端分离商城系统: SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue的前后端分离的商城系统, 包含分类、sku、运费模板、素材库、小程序直播、拼团、砍价、商户管理、 秒杀、优惠券、积分、分销、会员、充值、多门店等功能,更适合企业或个人二次开发; yshop基于当前流行技术组合的前后端分离商城系统: SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue的前后端分离的商城系统, 包含分类、sku、运费模板、素材库、小程序直播、拼团、砍价、商户管理、 秒杀、优惠券、积分、分销、会员、充值、多门店等功能,更适合企业或个人二次
SpringBoot+SpringSecurity+JWT+MybatisPlus实现基于注解的权限验证,可根据注解的格式不同,做到角色权限控制,角色加资源权限控制等,粒度比较细化。 @PreAuthorize("hasAnyRole('ADMIN','USER')"):具有admin或user角色的用户可以访问。 @PreAuthorize("hasRole('ADMIN') and hasRole('USER')"):具有admin和user角色的用户可以访问 文章地址:https://blog.csdn.net/fuu123f/article/details/108233463
Spring Security过滤器介绍 SpringSecurity 采用的是责任链的设计模式,它有一条很长的过滤器链。现在对这条过滤器链的 15 个过滤器进行说明: WebAsyncManagerIntegrationFilter:将 Security 上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成。 SecurityContextPersistenceFilter:在每次请求处理之前将该请求相关的安全上下文信息加载到 SecurityContex
FilterSecurityInterceptor.doFilter中调用了当前类的invoke(fi)方法参数fi为FilterInvocation(调用的对象内部封装了当前请求的一些列信息),该方法主要流程如下 public void invoke(FilterInvocation fi) throws IOException, ServletException { //判断当前请求的request不为null,FILTER_APPLIED这个属性限制 //了当前类型的过滤器仅执行一个,它结合obser
FilterSecurityInterceptor作为Spring Security Filter Chain的最后一个Filter,承担着非常重要的作用。如获取当前 request 对应的权限配置,调用访问控制器进行鉴权操作等,都是核心功能。 先简单看一下FilterSecurityInterceptor类的主要功用。 获取当前 request 对应的权限配置,首先是调用基类的beforeInvocation方法。 public void invoke(FilterInv...
我们可以通过集成AbstractAuthenticationProcessingFilter或者现有的过滤器来完成自定义的身份认证过滤器 身份验证过滤器的主要责任是何时进行身份认证以及如何进行身份认证等 以下是实现案例,可根据需求进行拓展和剔除 1. 继承AbstractAuthenticationProcessingFilter public class GetRequestAuthenticationFilter extends AbstractAuthenticationProcess ChannelProcessingFilter 使用https还是http的通过过滤器。通常是用来过滤哪些请求必须用https协议, 哪些请求必须用http协议, 哪些请求随便用哪个协议都行。 它主要有两个属性: ChannelDecisionManager:用来判断请求是否符合既定的协议规则。它维护了一个 ChannelProcessor 列表 这些ChannelProcessor 是具体用来执行 ANY_CHANNEL 策略 (任何通道都可以), REQUIRES_SECURE_CHA <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <group.
在项目中使用了为了使用spring security的token方式进行鉴权,继承了AbstractAuthenticationProcessingFilter来对请求拦截处理,如下: public class JwtAuthenticationTokenFilter extends AbstractAuthenticationProcessingFilter { private Sel...
上篇介绍了HttpSecurity如何建造过滤器链,本文主要介绍几个主要的过滤器认证过滤器 UsernamePasswordAuthenticationFilter 参数有username,password的,走UsernamePasswordAuthenticationFilter,提取参数构造UsernamePasswordAuthenticationToken进行认证,成功则填...
Spring Security是一个用于保护Java应用程序的框架,它提供了一系列过滤器来处理安全相关的任务。在Spring Security中,过滤器被组织成一个过滤器链(Filter Chain),它根据配置的顺序依次执行。以下是一些常用的Spring Security过滤器及其功能: 1. SecurityContextPersistenceFilter:用于在请求处理期间存储和检索SecurityContext,即当前用户的安全上下文。 2. LogoutFilter:处理用户注销请求,并清除当前用户的认证信息。 3. UsernamePasswordAuthenticationFilter:用于处理基于用户名和密码的认证请求。 4. ConcurrentSessionFilter:用于处理并发会话控制,限制同一用户的同时登录数。 5. BasicAuthenticationFilter:用于处理基于HTTP基本身份验证的认证请求。 6. RequestCacheAwareFilter:用于缓存请求,以便在重定向后重新发送请求。 7. SecurityContextHolderAwareRequestFilter:用于包装请求,使其能够识别特定的安全上下文。 8. AnonymousAuthenticationFilter:用于在请求上下文中添加匿名用户的认证信息。 9. SessionManagementFilter:用于处理会话管理,例如过期检查、并发控制等。 10. ExceptionTranslationFilter:用于捕获并处理异常,将其转换为合适的响应。 11. FilterSecurityInterceptor:用于实施访问控制,检查用户是否具有访问资源的权限。 这些过滤器可以根据具体的安全需求进行配置和组合,以提供所需的安全功能。通过指定不同的过滤器顺序、添加自定义过滤器或替换默认过滤器,您可以灵活地定制Spring Security过滤器链。 May_HanJing: BeanFactoryPostProcessor、InstantiationAwareBeanPostProcessor、BeanPostProcessor 按照这个这个顺序加载 1.BeanFactoryPostProcessor的执行时机是Bean的实例化过程之前,它本质上管理的BeanFactory(大部分情况下是ConfigurableListableBeanFactory容器),此时该容器存放的还是未实例化的Bean对象,也就是BeanDefinition对象,通过获取对应的BeanDefinition的进行属性修改。它允许修改容器中的 Bean 定义,可以添加、修改或删除 Bean 的属性值,甚至可以完全替换 Bean 的定义。通过实现这个接口,可以影响所有 Bean 的创建过程。 2.InstantiationAwareBeanPostProcessor作用于Bean的实例化前后(before早前,after在后),这个时机已经在内存中开辟了对应的内存地址,但是还没有进行属性的赋值,也就是在populaBean方法之前执行。它允许在 Bean 实例化过程中对 Bean 进行自定义处理,例如处理 Bean 的依赖关系、注入特定的属性或者在 Bean 初始化之前做一些额外的操作。通常用于对 Bean 实例化过程进行增强或定制。 3.BeanPostProcessor 作用于Bean的初始化前后(before和after两个方法或者说是阶段),对Bean做最后的增强处理,AOP就发生这个阶段,因为这个阶段会创建对应的代理对象。 [Doris] Doris架构原理 (一) CSDN-Ada助手: 什么是分布式架构? [Doris] Doris架构原理 (一) CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性;(2)使用更多的站内链接。 CMS 和G1 的区别 [24] 皎月摘星: 矛盾,标记清理的标记阶段只是和标记清除一样,不代表是一个意思,这个是两个算不同的算法 m0_74874986: 这里右移丢1,都从-26变成-13了为什么叫影响精度,不叫结果出错