三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解

news/2024/10/12 11:31:38

二、默认过滤器链

1、默认配置系统启动日志

image-20241011164955035

2、默认配置的过滤器及顺序如下

  1. org.springframework.security.web.session.DisableEncodeUrlFilter
  2. org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter
  3. org.springframework.security.web.context.SecurityContextPersistenceFilter
  4. org.springframework.security.web.header.HeaderWriterFilter
  5. org.springframework.security.web.csrf.CsrfFilter
  6. org.springframework.security.web.authentication.logout.LogoutFilter
  7. org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
  8. org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter
  9. org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter
  10. org.springframework.security.web.authentication.www.BasicAuthenticationFilter
  11. org.springframework.security.web.savedrequest.RequestCacheAwareFilter
  12. org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
  13. org.springframework.security.web.authentication.AnonymousAuthenticationFilter
  14. org.springframework.security.web.session.SessionManagementFilter
  15. org.springframework.security.web.access.ExceptionTranslationFilter
  16. org.springframework.security.web.access.intercept.FilterSecurityInterceptor

3、本文只介绍和登录相关的过滤器

  1. SecurityContextPersistenceFilter
  2. LogoutFilter
  3. UsernamePasswordAuthenticationFilter
  4. DefaultLoginPageGeneratingFilter
  5. DefaultLogoutPageGeneratingFilter
  6. AnonymousAuthenticationFilter
  7. ExceptionTranslationFilter
  8. FilterSecurityInterceptor

三、登录重要概念介绍

  1. 安全上下文仓库(SecurityContextRepository):用于存储安全上下文,默认基于session实现(HttpSessionSecurityContextRepository)
  2. 安全上下文持有者(SecurityContextHolder):用于存储本次请求的安全上下文,默认基于ThreadLocal实现
  3. 安全上下文(SecurityContext):用于存储认证信息
  4. 认证信息(Authentication):用于存储用户及认证结果信息,主要实现类有
  • 用户名密码认证Token:UsernamePasswordAuthenticationToken
  • 匿名认证Token:AnonymousAuthenticationToken
  1. 登录页面请求:跳转到登录页面的请求
  2. 登录请求:在登录页面输入用户名密码后提交的请求
  3. 登出页面请求:跳转到登出页面的请求
  4. 登出请求:在登出页面确认登出提交的请求
  5. 过滤器介绍
    1. 过滤器的入口为doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法
    2. 过滤器主要分为三部分:chain.doFilter之前代码,chain.doFilter,chain.doFilter之后的代码
    3. chain.doFilter之前的代码按照过滤器链顺序执行
    4. chain.doFilter之后的代码按照过滤器链倒序执行
    5. 调用chain.doFilter表示执行后续的过滤器;不调用chain.doFilter表示不执行后续的过滤器,会按过滤器链倒序执行已经调用的过滤器chain.doFilter之后的代码,这点很重要,下面在介绍每个过滤器时不再赘述。

四、SecurityContextPersistenceFilter

1、实现功能

  1. 登录成功之后的身份认证

2、处理请求类型

  • 所有请求

3、是否会终止过滤器链

  • 不会

4、实现步骤

  1. 从安全上下文仓库中获取安全上下文,如果为空则创建没有认证信息的安全上下文
  2. 将安全上下文设置到安全上下文持有者中供后续业务使用
  3. 调用后续过滤器链
  4. 从安全上下文持有者中获取最新的认证信息
  5. 清除安全上下文持有者中的认证信息
  6. 将步骤4中的认证信息添加到安全上下文仓库中

5、关键源码

image-20241011170847714

五、LogoutFilter

1、实现功能

  1. 清除认证信息
  2. 重定向登录页面

2、处理请求类型

  • 登出请求(默认:POST、/logout请求)

3、是否会终止过滤器链

  • 登出请求时会终止

4、实现步骤

  1. 匹配请求地址
  2. 清除认证信息(CompositeLogoutHandler中注册的LogoutHandler实现类)
  3. 调用登出成功处理器,默认SimpleUrlLogoutSuccessHandler实现重定向登录页面功能,推荐自定义配置,后续介绍

5、关键源码

image-20241011171703708

六、UsernamePasswordAuthenticationFilter

1、实现功能

  1. 使用提交的用户名密码生成用户名密码认证Token
  2. 根据认证结果做不同处理

2、处理请求类型

  • 登录请求(默认:POST、/login请求)

3、是否会终止过滤器链

  • 认证失败时会终止过滤器链,重定向默认登录地址
  • 认证成功时会终止过滤器链,重定向到目标URL地址

4、实现步骤

  1. 匹配请求地址
  2. 默认配置:提交的用户名密码和内存中用户名密码匹配,并校验用户和密码的是否有效等信息
  3. 认证失败时重定向到登录页面
  4. 认证成功时将已认证的安全上下文设置到安全上下文持有者中
  5. 重定向到目标URL地址(未认证访问目标地址,会先重定向登录页面,登录成功后再重定向到目标URL地址)

5、关键源码

image-20241011173506923

七、DefaultLoginPageGeneratingFilter

1、实现功能

  1. 生成默认登录页面

2、处理请求类型

  • 登录页面请求(默认GET、/login请求)
  • 登录失败
  • 登出成功

3、是否会终止过滤器链

  • 登录页面请求、登录失败、登出成功时会终止过滤器链

4、关键源码

image-20241011174012391

八、DefaultLogoutPageGeneratingFilter

1、实现功能

  1. 生成默认登出页面

2、处理请求类型

  • 登出页面请求(默认:GET、/logout请求)

3、是否会终止过滤器链

  • 登出页面请求时会终止过滤器链

4、关键源码

image-20241011175625114

九、AnonymousAuthenticationFilter

1、实现功能

  1. 当前认证信息为空时生成匿名认证信息

2、处理请求类型

  • 所有请求

3、是否会终止过滤器链

  • 不会

4、关键源码

image-20241011180011843

十、ExceptionTranslationFilter

1、实现功能

  1. 处理FilterSecurityInterceptor抛出的异常,根据异常做相应处理

2、处理请求类型

  • 所有请求

3、是否会终止过滤器链

  • 认证失败时会重定向登录页面
  • 授权失败时会返回错误信息

4、关键源码

image-20241011180451374

十一、FilterSecurityInterceptor

1、实现功能

  1. 认证和授权

2、处理请求类型

  • 所有请求

3、是否会终止过滤器链

  • 认证或授权失败会抛出异常由ExceptionTranslationFilter处理该异常

4、关键源码

image-20241011180950735

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/70596.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

winform图片截取

核查软件 项目简介:主要分为这几个模块:图片列表、图片旋转、图片裁剪、图片替换、案卷导入、文件导入、检查页数、检查页号、案卷和文件的增删改查、图片核查、后台数据管控、随机参沙、修改统计、日志记录。如需源码使用,请联系:lilf0117 以下是效果图展示:1.图片列表 左…

Odoo18.0 顺丰快递

适用于:15.0 16.0 17.0 18.0,不同版本功能有所不同, 详询客服。顺丰速运作为国内快递业的标杆企业,使用的频率可谓非常之高。对odoo国内生态而言,怎么能少了如此重要的一个对接方案呢。本文将展示如何使用顺丰速递模块来完成国内快递业务的对接。 先决条件 需要安装以下pyt…

Docker和K8S集群调用GPU

参考: 安装Docker插件 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html Unbntu使用Docker调用GPU https://blog.csdn.net/dw14132124/article/details/140534628 https://www.cnblogs.com/li508q/p/18444582环境查看 系统环境#…

mongo对文档中数组进行过滤的三种方法

想要实现数组的过滤有三种方法,包括:1. 聚合查询 使用`$unwind`将`travel`数组打散,获取结果集后用`$match`筛选符合条件的数据,最后使用`$group`进行聚合获取最终结果集 2. 聚合查询 使用`$match`过滤符合条件的根文档结果集,然后使用`$projec`t返回对应字段的同时,在`tr…

sshd 启动失败

解决方法 yum remove opensshyum install openssh openssh-server openssh-clientssystemctl start sshdsystemctl status sshd

ubuntu20 运行playwright

步骤 pip install playwrightplaywright installplaywright install-deps若弹出这个参考:https://www.cnblogs.com/code3/p/18458533 解决tip 但是貌似有2s的延迟。。本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/18460038

海康大华宇视等摄像头/执法记录仪等设备通过GB28181注册到LiveGBS流媒体平台,如何实时获取GB28181设备和通道的在线状态

@目录1、如何监听设备状态2、device订阅2.1、设备上线消息2.2、设备离线消息2.2、通道上线消息2.2、通道离线消息3、订阅示例3.1、连接REDIS3.2、订阅device示例3.3、设备上线示例3.3.1、注册上线后3.4、设备离线示例3.4.1、注销离线后4、更多4.1、如何切换redis5、搭建GB28181…

DIKI:清华提出基于残差的可控持续学习方案,完美保持预训练知识 | ECCV24

本研究解决了领域-类别增量学习问题,这是一个现实但富有挑战性的持续学习场景,其中领域分布和目标类别在不同任务中变化。为应对这些多样化的任务,引入了预训练的视觉-语言模型(VLMs),因为它们具有很强的泛化能力。然而,这也引发了一个新问题:在适应新任务时,预训练VL…