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的认证操作呢?要完成此功能,首先要有一套自己的页面!

若有收获,就点个赞吧


相关文章
|
存储 NoSQL 关系型数据库
InfluxDB 通识篇
InfluxDB 通识篇
2905 0
|
9月前
|
数据采集 人工智能 安全
|
9月前
|
消息中间件 运维 物联网
语音通知
语音通知服务适用于科技公司服务器或物联网设备异常时的告警通知。通过语音电话形式,向处理人播报预设模板内容,支持变量替换实现个性化提醒。需开通语音服务并申请资质、话术、号码及模板,可通过API发起呼叫并查询记录,支持主动查询与消息回执两种结果获取方式,提升运维响应效率。
语音通知
|
9月前
|
JSON 安全 机器人
钉钉通知
本文介绍如何通过Java代码调用钉钉机器人API实现系统告警消息推送。内容涵盖机器人创建、Webhook配置、Postman测试及Java代码实现,并提供限流策略与关键词安全设置等最佳实践,助力实时监控与异常通知。
|
9月前
|
数据采集 领域建模 数据库
领域模型图(数据架构/ER图)
本文介绍如何通过四色原型法构建领域模型,并逐步推导出数据架构中的ER图。采用红色(时标性)、绿色(参与方-物品-地点)、黄色(角色)和蓝色(描述)四色模型,结合风控系统案例,详解从业务流程到实体关系图的建模过程,助力精准梳理数据结构。
 领域模型图(数据架构/ER图)
|
存储 数据采集 Java
InfluxDB 的学习笔记
在Java项目中实现InfluxDB的落地应用,主要包括添加InfluxDB的Java客户端依赖、创建数据库连接、执行数据的增删改查操作等步骤
1229 2
|
9月前
|
安全 Java 应用服务中间件
4.认识SpringSecurity
Spring Security 是 Spring 生态中的安全框架,提供认证、授权及安全防护功能。支持多种认证方式(如表单、OAuth2、JWT等),基于过滤器链实现请求控制,可防御 CSRF 等攻击,保障 Web 应用安全。
|
弹性计算 关系型数据库 数据安全/隐私保护
《突破Unity+阿里云联机瓶颈:多人游戏同步延迟与数据安全的双维度优化》
本文结合真实案例,拆解Unity与阿里云结合的多人联机游戏在“实时同步延迟”和“玩家数据安全”上的优化路径。针对同步延迟,通过“差异化增量同步”降低ECS带宽占用,结合GME时间同步与“预测回滚”减少判定偏差;数据安全方面,用SSL和GME端到端加密保障传输,以“加盐哈希+KMS加密”及RDS日志审计强化存储防护。还借阿里云弹性伸缩动态调度ECS资源,结合Unity分块加载与阿里云CDN优化资源加载。最终提升游戏流畅度与安全性,降低运营成本,为相关开发提供实践参考。
688 2
|
SQL 前端开发 PHP
如何使用PHP开发一个购物网站?
在数字化时代,线上购物日益重要。本文介绍如何使用PHP开发一个功能完善、用户友好的购物网站,涵盖需求分析、开发环境选择、数据库设计、前后端开发、用户认证、商品展示、购物车、订单管理、功能扩展及安全性能优化等环节,旨在提供全面的开发指南。
499 3
|
监控 数据可视化 数据挖掘
InfluxDB查询语言Flux详解
【4月更文挑战第30天】InfluxDB的查询语言Flux是种函数式、声明性的脚本语言,用于处理时序数据。它包含管道操作符(`|`)来串联函数,内置函数如`range`、`filter`和`mean`,以及变量和运算符支持。Flux适用于实时监控、趋势分析、数据可视化等场景,帮助用户实现灵活高效的查询操作。了解其基本概念和语法,能提升时序数据分析的效率。
2284 1

热门文章

最新文章