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

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

一、默认过滤器

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

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

二、SecurityContextPersistenceFilter

1、实现功能

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

2、处理请求类型

  • 所有请求

3、是否会终止过滤器链

  • 不会

4、实现步骤

  1. 从认证仓库中(SecurityContextRepository)获取认证信息(SecurityContext,基于session实现),如果为空则创建未认证的认证信息
  2. 将认证信息设置到认证上下文中(SecurityContextHolder,线程绑定的)中供后续业务使用
  3. 调用后续过滤器链
  4. 从认证上下文中获取最新的认证信息
  5. 清除认证上下文中的认证信息
  6. 将步骤4中的认证信息添加到认证仓库中

5、关键源码

三、LogoutFilter

1、实现功能

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

2、处理请求类型

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

3、是否会终止过滤器链

  • 登出请求时会终止

4、实现步骤

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

5、关键源码

四、UsernamePasswordAuthenticationFilter

1、实现功能

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

2、处理请求类型

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

3、是否会终止过滤器链

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

4、实现步骤

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

5、关键源码

五、DefaultLoginPageGeneratingFilter

1、实现功能

  1. 生成默认登录页面

2、处理请求类型

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

3、是否会终止过滤器链

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

4、关键源码

六、DefaultLogoutPageGeneratingFilter

1、实现功能

  1. 生成默认登录页面

2、处理请求类型

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

3、是否会终止过滤器链

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

4、关键源码

七、AnonymousAuthenticationFilter

1、实现功能

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

2、处理请求类型

  • 所有请求

3、是否会终止过滤器链

  • 不会

4、关键源码

八、ExceptionTranslationFilter

1、实现功能

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

2、处理请求类型

  • 所有请求

3、是否会终止过滤器链

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

4、关键源码

九、FilterSecurityInterceptor

1、实现功能

  1. 认证和授权

2、处理请求类型

  • 所有请求

3、是否会终止过滤器链

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

4、关键源码

十、Spring Boot集成Spring Security专栏

一、Spring Boot集成Spring Security之自动装配
二、Spring Boot集成Spring Security之实现原理
三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解
四、Spring Boot集成Spring Security之登录登出业务实现逻辑(未完成)
五、Spring Boot集成Spring Security之登录成功后自动认证业务实现逻辑(未完成)
六、Spring Boot集成Spring Security之自定义securityFilterChain过滤器链(未完成)
七、Spring Boot集成Spring Security之自定义基于JWT的用户名密码认证(未完成)
八、Spring Boot集成Spring Security之登录成功后JWT自动认证(未完成)
九、Spring Boot集成Spring Security之验证码认证(未完成)

相关推荐
梁同学与Android2 分钟前
Android ---【经验篇】ArrayList vs CopyOnWriteArrayList 核心区别,怎么选择?
android·java·开发语言
ss27315 分钟前
从零实现线程池:自定义线程池的工作线程设计与实现
java·开发语言·jvm
苗壮.17 分钟前
CommandLineRunner 是什么?
java
石工记22 分钟前
windows 10直接安装多个JDK
java·开发语言
菜鸟233号23 分钟前
力扣669 修剪二叉搜索树 java实现
java·数据结构·算法·leetcode
健康平安的活着41 分钟前
springboot+sse的实现案例
java·spring boot·后端
05大叔1 小时前
多线程的学习
java·开发语言·学习
小萌新上大分1 小时前
synchronized的8锁问题(区分默认用的是那把锁) 笔记云备份
java·java多线程·synchronized·synchronized关键字·synchronized用法·多线程买票问题·java锁机制
sino爱学习2 小时前
别再踩 Stream 的坑了!Java 函数式编程安全指南
java·后端
Sunsets_Red2 小时前
2025 FZYZ夏令营游记
java·c语言·c++·python·算法·c#