二、Spring Boot集成Spring Security之实现原理

Spring Boot集成Spring Security之实现原理

一、Spring Security实现原理概要介绍

  1. 使用WebSecurityConfiguration向Spring容器中注册FilterChainProxy类型的对象springSecurityFilterChain
  2. 使用SecurityFilterAutoConfiguration向Spring容器中注册DelegatingFilterProxyRegistrationBean(实现了ServletContextInitializer)类型对象securityFilterChainRegistration
  3. 使用ServletContextInitializer方式向Servlet上下文中注册原生过滤器DelegatingFilterProxy,其名称也是springSecurityFilterChain
  4. 发送请求时Servlet 过滤器DelegatingFilterProxy拦截请求,从Spring容器中获取名称为springSecurityFilterChain的被代理的filter对象
  5. 调用该filter对象的doFilter方法
    1. 从配置的securityFilterChain过滤器链中获取匹配的过滤器链
    2. 将原生的Servlet过滤器链,请求对象,匹配的securityFilterChain创建为新的过滤器链对象VirtualFilterChain
    3. 调用VirtualFilterChain对象的doFilter方法
    4. 先执行securityFilterChain过滤器链,后执行原生的Servlet过滤器链

二、使用WebSecurityConfiguration向Spring容器中注册FilterChainProxy类型的对象springSecurityFilterChain

1、未配置securityFilterChain过滤器链时使用默认配置用于生成默认securityFilterChain

2、注册securityFilterChain过滤器链构造器

3、构建FilterChainProxy类型的对象springSecurityFilterChain并注册到Spring容器中

三、使用代理模式和模板模式向Servlet容器中注册委托过滤器代理对象DelegatingFilterProxy

1、初始化DelegatingFilterProxyRegistrationBean对象(上文已介绍)

  • DelegatingFilterProxyRegistrationBean类图

三、使用ServletContextInitializer方式注册DelegatingFilterProxy(模板模式)

  1. ServletContextInitializer接口onStartup方法(未探究该接口的实现机制,后续探究)
  2. RegistrationBean实现onStartup方法,并调用预留抽象方法register
  3. DynamicRegistrationBean实现register方法,并调用预留抽象方法addRegistration
  4. AbstractFilterRegistrationBean实现addRegistration方法,并调用预留抽象方法getFilter获取过滤器,并将过滤器注册到Servlet上下文中
  5. DelegatingFilterProxyRegistrationBean实现getFilter方法,创建DelegatingFilterProxy对象,并设置targetBeanName为springSecurityFilterChain和传递Spring容器上下文对象;DelegatingFilterProxy对象注册到servlet上下文中,未注册到Spring容器中

四、请求处理流程

1、servlet方式请求处理流程

  1. servlet原生过滤器处理:执行doFilter及之前的代码
  2. servlet处理:执行service方法
  3. servlet原生过滤器处理:执行doFilter之后的代码

2、Spring Security方式请求处理流程

  1. servlet原生过滤器处理:执行chain.doFilter及之前的代码
    1. 执行到DelegatingFilterProxy的doFilter方法
    2. 从Spring容器中获取名称springSecurityFilterChain的FilterChainProxy对象(第一次请求时执行,后续不在执行)
    3. 调用FilterChainProxy的doFilter方法
    4. 从配置的securityFilterChain过滤器链中获取匹配的过滤器链
    5. 将原生的Servlet过滤器链,请求对象,匹配的securityFilterChain创建为新的过滤器链对象VirtualFilterChain
    6. 调用VirtualFilterChain对象的doFilter方法
    7. 先执行securityFilterChain过滤器链,后执行原生的Servlet过滤器链
  2. servlet处理:执行service方法
  3. servlet原生过滤器处理:执行chain.doFilter之后的代码
    1. 执行到DelegatingFilterProxy的doFilter之后的方法
    2. 调用FilterChainProxy的doFilter之后的方法
    3. 调用VirtualFilterChain对象的doFilter之后的方法
    4. 执行原生的Servlet过滤器链之后的方法

五、总结

  1. 向servlet容器中注册DelegatingFilterProxy
  2. DelegatingFilterProxy代理的过滤器是类型FilterChainProxy名称是springSecurityFilterChain
  3. springSecurityFilterChain中有securityFilterChain集合
  4. DelegatingFilterProxy.doFilter方法会调用springSecurityFilterChain.doFilter方法
  5. springSecurityFilterChain.doFilter方法会创建虚拟过滤器VirtualFilterChain,并调用VirtualFilterChain.doFilter方法
  6. VirtualFilterChain.doFilter方法会先执行securityFilterChain,再执行后续的原生过滤器链
相关推荐
weixin_545019322 分钟前
Spring Boot 项目开启 HTTPS 完整指南:从原理到实践
spring boot·后端·https
长存祈月心4 分钟前
Rust 迭代器适配器
java·服务器·前端
超龄超能程序猿4 分钟前
SpringAIalibaba +milvus本地化全链路知识库系统
java·人工智能·spring·milvus
rengang668 分钟前
103-Spring AI Alibaba Milvus RAG 示例
人工智能·spring·milvus·rag·spring ai·ai应用编程
沐雨橙风ιε12 分钟前
防止表单重复提交功能简单实现
java·spring boot·ajax·axios·spring mvc
熙客13 分钟前
后端日志框架
java·开发语言·log4j·logback
全栈师17 分钟前
LigerUI下frm与grid的交互
java·前端·数据库
摇滚侠33 分钟前
Spring Boot3零基础教程,Kafka 的简介和使用,笔记76
spring boot·笔记·kafka
剑小麟34 分钟前
maven中properties和dependencys标签的区别
java·前端·maven
Chief_fly35 分钟前
Logback 配置精细化包日志控制
java·logback