Spring Security 实战干货:图解Spring Security的过滤器体系
2021-04-01 15:27
标签:存在 而且 总结 先来 info 功能 dir red 结果 我在Spring Security 实战干货:内置 Filter 全解析对Spring Security的内置过滤器进行罗列,但是Spring Security真正的过滤器体系才是我们了解它是如何进行"认证"、“授权”、“防止利用漏洞”的关键。 这里我们以Servlet Web为讨论目标,Reactive Web暂不讨论。我们先来看下最基础的Servlet体系,在Servlet体系中客户端发起一个请求过程是经过 0 到 N 个 servlet过滤器链 由于 在该系列的文章开篇我对Spring Security 和 Shiro 进行了简单的对比。Spring Security利用了Spring IOC和AOP的特性而无法脱离Spring独立存在,而Apache Shiro可以独立存在。所以今天我们要一探究竟,看看他们是如何结合的。 Spring结合Servlet Filter自然是要为Servlet Filter注入Spring Bean的特性,所以就搞出了一个抽象Filter Bean,这个抽象过滤器 image-20200701162747774 我们希望Servlet能够按照它自己的标准来注册到过滤器链中工作,但是同时也希望它能够被Spring IoC管理,所以 Spring 提供了一个 DelegatingFilterProxy 针对不同符合Ant Pattern的请求可能会走不同的过滤器链,比如登录会去验证,然后返回登录结果;管理后台的接口走后台的安全逻辑,应用客户端的接口走客户端的安全逻辑。Spring Security提供了一个 SecurityFilterChain 不同的 不同的请求经过不同的SecurityFilterChain 如上图请求被匹配到不同的 结合上面,最终上述这些概念的关系彻底搞清楚了,搞清楚过滤器的运作模式对于学习和使用Spring Security至关重要。 Spring Security Servlet过滤器链组织关系 Spring Security 实战干货:图解Spring Security的过滤器体系 标签:存在 而且 总结 先来 info 功能 dir red 结果 原文地址:https://blog.51cto.com/14901317/25230502. Servlet Filter 体系
Filter
然后交给Servlet
处理。Filter
不但可以修改HttpServletRequest
和HttpServletResponse
,可以让我们在请求响应的前后做一些事情,甚至可以终止过滤器链FilterChain
的传递。 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// 请求被servlet 处理前
if(condition){
// 根据条件来进入下一个过滤器
chain.doFilter(request, response);
}
// 请求被执行完毕后处理一些事情
}
Filter
仅影响下游Filters和Servlet,因此每个Filter
调用的顺序非常重要。Spring Security正是根据这个个特性来实现一系列的安全功能。接下来我们来看看它们是如何结合的。3. GenericFilterBean
GenericFilterBean
并不是在Spring Security下,而是Spring Web体系中,类图如下:4. DelegatingFilterProxy
GenericFilterBean
的实现DelegatingFilterProxy
。我们可以将原生的Servlet Filter或者Spring Bean Filter委托给DelegatingFilterProxy
,然后在结合到Servlet FilterChain中。5. SecurityFilterChain
SecurityFilterChain
接口来满足被匹配HttpServletRequest
走特定的过滤器链的需求。public interface SecurityFilterChain {
// 判断请求 是否符合该过滤器链的要求
boolean matches(HttpServletRequest request);
// 对应的过滤器链
List
6. FilterChainProxy
SecurityFilterChain
应该是互斥而且平等的,它们之间不应该是上下游关系。SecurityFilterChain
然后在执行剩余的过滤器链。它们经过SecurityFilterChain
的总流程是相似的,而且有些时候特定的一些SecurityFilterChain
也需要被集中管理来实现特定一揽子的请求的过滤逻辑。所以就有了另外一个GenericFilterBean
实现来做这个事情,它就是FilterChainProxy
。它的作用就是拦截符合条件的请求,然后根据请求筛选出符合要求的SecurityFilterChain
,然后链式的执行这些Filter,最后继续执行剩下的FilterChain
。7. 总结
文章标题:Spring Security 实战干货:图解Spring Security的过滤器体系
文章链接:http://soscw.com/index.php/essay/70984.html