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 通识篇
2587 0
|
消息中间件 存储 XML
Kettle实现rabbitMQ的生产与消费
文章目录 一、Kettle为什么可以读取流数据? 二、rabbitMQ中启动MQTT插件并创建队列和路由键 三、Kettle实现rabbitMQ的生产与消费 Kettle是一款非常强大的ETL工具,不仅可以使用图形化界面,还可以处理各种数据,今天记录一下本人使用Kettle中MQTT组件来实现从rabbitMQ中读取流数据,并进行解析和处理。 提示:以下是本篇文章正文内容,下面案例可供参考
|
4月前
|
存储 数据采集 供应链
RFID库房进出入无感采集盘点
RFID库房无感采集通过电子标签与读写设备自动识别,实现货物进出库实时记录、动态盘点,无需人工干预。相比传统方式,大幅提升效率与准确性,支持全程追溯,推动仓储管理向智能化、数字化升级。(238字)
|
4月前
|
消息中间件 运维 物联网
语音通知
语音通知服务适用于科技公司服务器或物联网设备异常时的告警通知。通过语音电话形式,向处理人播报预设模板内容,支持变量替换实现个性化提醒。需开通语音服务并申请资质、话术、号码及模板,可通过API发起呼叫并查询记录,支持主动查询与消息回执两种结果获取方式,提升运维响应效率。
语音通知
|
4月前
|
JSON 安全 机器人
钉钉通知
本文介绍如何通过Java代码调用钉钉机器人API实现系统告警消息推送。内容涵盖机器人创建、Webhook配置、Postman测试及Java代码实现,并提供限流策略与关键词安全设置等最佳实践,助力实时监控与异常通知。
|
4月前
|
安全 Java 应用服务中间件
4.认识SpringSecurity
Spring Security 是 Spring 生态中的安全框架,提供认证、授权及安全防护功能。支持多种认证方式(如表单、OAuth2、JWT等),基于过滤器链实现请求控制,可防御 CSRF 等攻击,保障 Web 应用安全。
|
4月前
|
云安全 运维 安全
政务云安全合规建设
政务云安全合规建设是数字政府的基石,需以等保2.0、密码法为遵循,构建专有云架构、数据分类分级防护、全链路审计、两地三中心容灾及国产化运维体系,实现全链条安全可控。通过等保测评验收,确保合规落地,助力数字政府安全发展。(238字)
357 0
|
供应链 NoSQL Java
用Redisson写一个库存扣减的方法
通过本文的介绍,我们详细讲解了如何使用Redisson实现一个简单的库存扣减功能。通过使用分布式锁,可以确保库存扣减操作的原子性和高效性。希望本文能帮助您更好地理解和应用Redisson,构建高效、可靠的库存管理系统。
543 15
|
存储 数据采集 Java
InfluxDB 的学习笔记
在Java项目中实现InfluxDB的落地应用,主要包括添加InfluxDB的Java客户端依赖、创建数据库连接、执行数据的增删改查操作等步骤
1073 2
|
监控 数据可视化 数据挖掘
InfluxDB查询语言Flux详解
【4月更文挑战第30天】InfluxDB的查询语言Flux是种函数式、声明性的脚本语言,用于处理时序数据。它包含管道操作符(`|`)来串联函数,内置函数如`range`、`filter`和`mean`,以及变量和运算符支持。Flux适用于实时监控、趋势分析、数据可视化等场景,帮助用户实现灵活高效的查询操作。了解其基本概念和语法,能提升时序数据分析的效率。
2077 1