文章目录
- 一、引入
- 二、Filter
- 1)DelegatingFilterProxy
- 2)FilterChainProxy
- 3)SecurityFilterChain
- 4)Multiple SecurityFilterChain
一、引入
官方文档:Spring Security的底层原理
Architecture:整个SpringSecurity的基础架构
官方解释:本节讨论 Spring Security 在基于 Servlet 的应用程序中的高级体系结构。 我们在参考的“身份验证、授权和防范漏洞利用”部分中基于这种高层次的理解。
Spring Security之所以默认帮助我们做了那么多事情,它的底层原理是传统的Servlet过滤器
请求由我们的客户端向后端服务器发起,经过层层过滤器的进行,最后它会到达Servlet。
我们刚刚写的index方法,底层就是servlet当中的具体的方法。因为我们的应用程序是SpringBoot程序,所以我们的应用程序是通过controller的方式来实现的servlet。
在正常情况下这些过滤器在应用程序启动的时候就要被注册在servlet容器里才能工作,但为了更灵活的在应用程序当中配置这些过滤器,其实我们的应用程序采用的是SpringBoot形式,而SpringBoot里的本质是spring、springMVC这些基础框架,也就意味着,其实在spring这种环境下,希望把这些Filter对象当做spring容器中的bean对象来管理。这些过滤器在添加、删除、启用和禁用的过程中就会更灵活。
二、Filter
下图展示了处理一个Http请求时,过滤器和Servlet的工作流程:
因此我们可以在过滤器中对请求进行修改或增强。
1)DelegatingFilterProxy
DelegatingFilterProxy(委托过滤器代理) 是 Spring Security 提供的一个 Filter 实现,可以在 Servlet 容器和 Spring 容器之间建立桥梁。通过使用 DelegatingFilterProxy,这样就可以将Servlet容器中的 Filter 实例放在 Spring 容器中管理。
filter先以bean对象的形式注册在spring容器中,DelegatingFilterProxy帮助我们在spring的环境中加载filter bean对象。但因为DelegatingFilterProxy本身也是个filter,它会被注册在servlet过滤器链(FilterChain)中。在Spring容器中注册的bean filter就可以在DelegatingFilterProxy调用,从而工作在整个Servlet中的FilterChain,也就是过滤器链中。整个过程就叫做委托。
2)FilterChainProxy
复杂的业务中不可能只有一个过滤器。因此FilterChainProxy是Spring Security提供的一个特殊的Filter,它允许通过SecurityFilterChain将过滤器的工作委托给多个Bean Filter实例。
应用程序为了更灵活,DelegatingFilterProxy管理FilterChainProxy过滤器链代理的这个类,然后通过过滤器链代理再去调用SecurityFilterChain。FilterChainProxy又被DelegatingFilterProxy调用。DelegatingFilterProxy是真正注册在servlet容器中的。
3)SecurityFilterChain
SecurityFilterChain 被 FilterChainProxy 使用,负责查找当前的请求需要执行的Security Filter列表。
4)Multiple SecurityFilterChain
为了让应用程序更灵活。可以有多个SecurityFilterChain
的配置,FilterChainProxy决定使用哪个SecurityFilterChain,用于处理更复杂的应用程序。
如果请求的URL是 /api/messages/
,它首先匹配SecurityFilterChain0的模式/api/**
,因此只调用SecurityFilterChain 0,r如果在 SecurityFilterChain 0
中没有找到实例匹配,就会一直从SecurityFilterChain 0找到SecurityFilterChain n - 1。假设没有其他SecurityFilterChain实例匹配,那么将调用SecurityFilterChain n,它匹配的是/**,也就是所有客户端的请求。