2.过滤器链加载原理

简介: 本文深入解析Spring Security过滤器链的加载原理,通过分析DelegatingFilterProxy、FilterChainProxy及SecurityFilterChain源码,揭示十五个过滤器如何自动装配并生效,帮助开发者理解框架底层机制,为自定义认证流程奠定基础。

2.过滤器链加载原理

通过前面十五个过滤器功能的介绍,对于SpringSecurity简单入门中的疑惑是不是在心中已经有了答案了呀? 但新的问题来了!我们并没有配置这些过滤器啊?它们都是怎么被加载出来的?

1-DelegatingFilterProxy
我们在web.xml中配置了一个名称为springSecurityFilterChain的过滤器DelegatingFilterProxy,接下我直接对 DelegatingFilterProxy源码里重要代码进行说明,其中删减掉了一些不重要的代码,大家注意我写的注释就行了!
第二步debug结果如下:

DELEGATE=(FILERCHAINPROY@4132)FLTERCHAINPROX[FLTERCHAINS:[LARYREQUESTLORGSPRINGFRAMEVORKSECURITYWVEB.CONTEXT.

AE=(XMLLEBAPPLICATIBNCONTEXT@4088ROOTWEBAPPLICATIONCONTEXT,STARTEDONTUEJUN2513:52

STRINGTARGETBEANLNAMETHIS.GETLARGETBEANLAME()

TARGETBEANNAME"SPRINGSECURITYFILTERCHQIN"

MESSAGE:NOTARGETBEANNAMESET

ATE.INIT(THIS.GETFILTERCONFIGO)):

ARGETBEANNAME:SPRINGSECUXITYHILTERCH

(FILTER)WAC.GETBEAN(TARGETBEANLNAME,H

TNIS.ISTARGETFILTERLIFECYCLE

NITDELEGATEWEBAPPLICAT1ON

AME.FILTER,CLASS):DELEGATE:FILTERCH

DELEGATINGFILTERPROXY>

ETHIS三DELEGATINGFILTERPIO>

EXPRESSION:TARGETBEAAME

TOMCATCATALINALOG

>INITDEEHATE0

SSERVLETEXCEPTIO

FILTERDLELEGATE

VARIABLES

PROTECTEDHILT

上兰土百国器

TERPTOXY@4087

DELEGATE.INI

ASSERT.STATE(EX

THROWSS

WAC:ROO

三仑

INQFR

XTWAC)

.WEE

AME!ENU1L

RINAT

WAE..NRI1TARCHAI


由此可知,DelegatingFilterProxy通过springSecurityFilterChain这个名称,得到了一个FilterChainProxy过滤器, 最终在第三步执行了这个过滤器。
2-FilterChainProxy
注意代码注释!
第二步debug结果如下图所示,惊不惊喜?十五个过滤器都在这里了!

IF(FI1TERS!=NU1&&FILTERS.SIZE0)!E0)FILTERS:S

5三USERNAMEPASSWORDAUTHENTICATIONFILTER@4255

11={ANONYMOUSAUTHENTICATIONFILTER@4261)

7=DEFAULTLOAOUTPAGEGENERATINGFILTER@4257

1=WEBASYNCMANAGERLNTEGRATIONFILTER@4251)

13=EXCEPTIONTRANSLATIONFILTER@4263)

10=(SECURITYCONTEXTHOLDERAWAREREQUESTFILTER@4260)

三土土工国明

三9=(REQUESTCACHEAWAREFILTER@4259)

LIST<FILTER>FILTERS

6=DEFAULTLOGINPAGEGENERATINGFILTER@4256

12三(SESSIONMANAGEMENTFILTER@4262}

WRESPONSE三FIREWALLEDRESPONSE@4222)

ETHIS.GETFILTER

FILTERS=(ARRAYLIST@4245)SIZE三15

三14=FILTERSECURITYLNTERCEPTOR@4264)

三0=(SECURITYCONTEXTPERSISTENCEFILTER@4250

8=BASICAUTHENTICATIONFILTER@4258

三3-CSRFILTER@4253)

一4-LOGOUTFILTER@4254

三2-HEADERWRITERFILTER@4252

FI1TERS:

ATALINALOG

Y>DOFILTERLNTERNA

SIZE-15

PROXY

SGETHILTERS((HTTPSERVLETREQUEST)FWREQUIEST);

ABLES

IF(FI1TERS


再看第三步,怀疑这么久!原来这些过滤器还真是都被封装进SecurityFilterChain中了。
3-SecurityFilterChain
最后看SecurityFilterChain,这是个接口,实现类也只有一个,这才是web.xml中配置的过滤器链对象!

Java

运行代码复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

//接口

public interface SecurityFilterChain {

boolean matches(HttpServletRequest var1);

List<Filter> getFilters();

}


//实现类

public final class DefaultSecurityFilterChain implements SecurityFilterChain {

private static final Log logger = LogFactory.getLog(DefaultSecurityFilterChain.class);

private final RequestMatcher requestMatcher;

private final List<Filter> filters;

public DefaultSecurityFilterChain(RequestMatcher requestMatcher,

Filter... filters) {

this(requestMatcher, Arrays.asList(filters));

}

public DefaultSecurityFilterChain(RequestMatcher requestMatcher,

List<Filter> filters) {

logger.info("Creating filter chain: " + requestMatcher + ", " + filters);

this.requestMatcher = requestMatcher;

this.filters = new ArrayList(filters);

}

public RequestMatcher getRequestMatcher() {

return this.requestMatcher;

}

public List<Filter> getFilters() {

return this.filters;

}

public boolean matches(HttpServletRequest request) {

return this.requestMatcher.matches(request);

}

public String toString() {

return "[ " + this.requestMatcher + ", " + this.filters + "]";

}

}

总结:通过此章节,我们对SpringSecurity工作原理有了一定的认识。但理论千万条,功能第一条,探寻底层,是为了更好的使用框架。 那么,言归正传!到底如何使用自己的页面来实现SpringSecurity的认证操作呢?要完成此功能,首先要有一套自己的页面!

若有收获,就点个赞吧


相关文章
|
2天前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图,横轴为对象,纵轴为时间。它用于展示系统动态协作过程,强调交互的时间先后关系,直观呈现并发行为。主要元素包括角色、对象、生命线、控制焦点和消息等,广泛应用于软件设计建模。
系统时序图
|
2天前
|
消息中间件 存储 数据挖掘
应用架构图
本文介绍应用架构图的设计原理,涵盖单体与分布式架构模式。重点解析展现层、业务层、数据层及基础通用层的分层设计,阐述系统间调用关系与外部依赖,明确应用边界,指导技术方案落地。
|
2天前
|
消息中间件 运维 物联网
语音通知
语音通知服务适用于科技公司服务器或物联网设备异常时的告警通知。通过语音电话形式,向处理人播报预设模板内容,支持变量替换实现个性化提醒。需开通语音服务并申请资质、话术、号码及模板,可通过API发起呼叫并查询记录,支持主动查询与消息回执两种结果获取方式,提升运维响应效率。
语音通知
|
1天前
|
项目管理 开发者
业务架构图
业务架构图是梳理业务层级与关系的工具,通过分层、分模块、分功能,抽象出业务核心结构,明确各部分职责与协作,服务于客户理解与系统开发,是连接业务与技术的重要桥梁。
Day07
简介:本文讲解CAP与BASE理论核心要点,阐述分布式系统中一致性、可用性与分区容错性的权衡,解析Seata AT模式的执行流程,并探讨MQ消息防丢失、重复消费及积压处理等关键问题。
Day07
|
1天前
|
运维 Devops 开发工具
生产环境缺陷管理
针对大型团队多分支开发中bug管理难题,本文介绍基于go-git实现的分布式工具git-poison,通过“投毒-解药-银针”机制,实现bug的自动化追溯、发布卡点与影响范围精准识别,有效避免人为疏漏导致的生产事故,提升缺陷管理效率与系统稳定性。
生产环境缺陷管理
|
1天前
|
Dubbo Java 应用服务中间件
Day02
Day02:掌握Spring Cloud Gateway原理,基于Netty实现非阻塞请求转发;项目采用OpenFeign进行远程调用;深入JVM模型、垃圾回收、类加载及调优。
Day02
|
1天前
|
负载均衡 Dubbo 应用服务中间件
Day01
本文介绍微服务架构的适用场景及技术选型,对比单体与微服务优劣,详解Nacos与Eureka注册中心的心跳机制、服务治理差异,并涵盖常见负载均衡算法及SpringCloud Alibaba常用组件实践。
 Day01
|
1天前
|
存储 安全 算法
第一章 Java基础
本章系统讲解Java基础核心知识,涵盖重载与重写、==与equals、String三兄弟区别、异常体系、集合类原理(如HashMap结构与扩容)、线程并发(ThreadLocal、锁机制)、JVM内存模型、Lambda表达式、反射泛型及Tomcat优化等内容,深入浅出,助力夯实Java基础。
第一章 Java基础
|
1天前
|
存储 缓存 Java
自定义注解
本文介绍Java自定义注解的实现原理与应用,结合Spring AOP 和过滤器实现日志、权限控制及登录验证,涵盖注解定义、@Target、@Retention等核心语法,并通过代码示例展示实际使用流程。
 自定义注解