过滤器原理分析

简介: 本文详解Spring Security过滤器链的加载原理,通过DelegatingFilterProxy、FilterChainProxy到SecurityFilterChain,揭示十五个过滤器如何自动装配并生效,帮助理解框架底层机制,为自定义认证页面打下基础。

过滤器链加载原理

通过前面十五个过滤器功能的介绍,对于SpringSecurity简单入门中的疑惑是不是在心中已经有了答案了呀? 但新的问题来了!我们并没有配置这些过滤器啊?它们都是怎么被加载出来的? 1-DelegatingFilterProxy 我们在web.xml中配置了一个名称为springSecurityFilterChain的过滤器DelegatingFilterProxy,接下我直接对 DelegatingFilterProxy源码里重要代码进行说明,其中删减掉了一些不重要的代码,大家注意我写的注释就行了!

第二步debug结果如下: 由此可知,DelegatingFilterProxy通过springSecurityFilterChain这个名称,得到了一个FilterChainProxy过滤器, 最终在第三步执行了这个过滤器。 2-FilterChainProxy 注意代码注释!第二步debug结果如下图所示,惊不惊喜?十五个过滤器都在这里了! 再看第三步,怀疑这么久!原来这些过滤器还真是都被封装进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的认证操作呢?要完成此功能,首先要有一套自己的页面!

相关文章
|
7月前
|
安全 Java 数据安全/隐私保护
认识SpringSecurity
Spring Security 是基于过滤器链的成熟安全框架,提供认证、鉴权及防御 CSRF 等攻击的核心功能,支持多种认证方式与灵活的权限控制模型。
|
7月前
|
SQL 容灾 Nacos
Seata的部署和集成
本文介绍Seata分布式事务框架的部署与微服务集成。首先下载并解压Seata Server,修改配置文件application.yml,并在Nacos中配置seataServer.properties及数据库信息。创建seata数据库并运行SQL脚本初始化事务表。启动TC服务后,注册至Nacos。各微服务引入Seata依赖,配置application.yml连接TC。为实现高可用,搭建多节点TC集群,通过Nacos统一管理事务组映射,实现异地容灾与动态切换。微服务从Nacos读取client.properties,灵活绑定TC集群,提升系统稳定性与可维护性。(238字)
|
7月前
|
测试技术 数据处理 微服务
基于稳定版量化交易系统开发案例设计的功能需求实现
在数字化时代,量化交易系统需兼顾高效性与稳定性。本文聚焦稳定版系统开发,探讨案例设计与功能需求,涵盖微服务架构、实时行情、信号生成、风控等核心环节,为构建精准、可靠的量化交易体系提供实践指导。
|
安全 物联网 Linux
带你读《物联网渗透测试》之三:固件分析与漏洞利用
本书介绍物联网渗透测试的原理和实用技术。主要内容包括IOT威胁建模、固件分析及漏洞利用、嵌入式web应用漏洞、IOT移动应用漏洞、IOT设备攻击、无线电入侵、固件安全和移动安全最佳实践、硬件保护以及IOT高级漏洞的利用与安全自动化。
|
4月前
|
机器学习/深度学习 自然语言处理 搜索推荐
你的模型真的“懂”吗?用 Captum / SHAP 把神经网络扒开给你看
你的模型真的“懂”吗?用 Captum / SHAP 把神经网络扒开给你看
484 4
|
7月前
|
消息中间件 Java 数据安全/隐私保护
RabbitMQ集群部署
本文介绍RabbitMQ集群部署,包括普通模式与高可用方案。首先通过Docker搭建三节点集群,配置Erlang Cookie和rabbitmq.conf实现节点通信;接着演示队列创建、数据共享及宕机测试,发现普通模式无高可用能力;进而引入镜像模式,通过策略设置实现队列多副本,支持主从切换;最后重点介绍3.8版本后推荐的仲裁队列,其具备自动选举、强一致性等优势,配置更简便,是实现高可用的首选方案。
RabbitMQ集群部署
|
7月前
|
安全 Java 数据安全/隐私保护
通用权限管理模型
本文介绍了ACL和RBAC两大权限模型。ACL通过直接授权用户或角色访问对象,实现简单但管理复杂;RBAC则基于角色分配权限,通过用户-角色-权限三层结构提升管理效率,并衍生出支持角色继承(RBAC1)、职责分离(RBAC2)及两者结合的RBAC3模型,适用于复杂系统权限控制。
|
10月前
|
人工智能 JSON 算法
向量嵌入的天花板与AI检索的模式更迭
本文提出突破传统“单向量嵌入+ANN”检索范式,构建多结构协同的下一代AI检索框架。通过多通道嵌入、组合键兜底、知识图推理、程序化计划与生成-校验闭环,实现高可信、可解释、可验证的智能检索,应对复杂任务中的信息漏检与推理难题,推动RAG迈向结构化、可编程的认知系统。
363 12
|
存储 Web App开发 安全
全平台最佳密码管理工具大全:支持 Windows、Linux、Mac、Android、iOS 以及企业应用
原文 当谈到网络安全的防护时,从各种网络威胁的角度来看,仅安装一个防病毒软件或运行一个安全的 Linux 操作系统,并不意味你就是足够安全的。
5245 0
|
弹性计算 网络安全 网络虚拟化
IPsec-VPN配置|学习笔记
快速学习IPsec-VPN配置
IPsec-VPN配置|学习笔记