Spring Security 实战干货:图解Spring Security中的Servlet过滤器体系

1. 前言

我在Spring Security 实战干货:内置 Filter 全解析Spring Security的内置过滤器进行了罗列,可是Spring Security真正的过滤器体系才是咱们了解它是如何进行"认证"、“受权”、“防止利用漏洞”的关键。html

2. Servlet Filter体系

这里咱们以Servlet Web为讨论目标,Reactive Web暂不讨论。咱们先来看下最基础的Servlet体系,在Servlet体系中客户端发起一个请求过程是通过0到N个Filter而后交给Servlet处理。java

servlet过滤器链

Filter不但能够修改HttpServletRequestHttpServletResponse,可让咱们在请求响应的先后作一些事情,甚至能够终止过滤器链FilterChain的传递。spring

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
     // 请求被servlet 处理前 
      if(condition){
        // 根据条件来进入下一个过滤器
          chain.doFilter(request, response);  
      }
     // 请求被执行完毕后处理一些事情 
 }
复制代码

因为Filter仅影响下游FiltersServlet,所以每一个Filter调用的顺序很是重要。Spring Security正是根据这个个特性来实现一系列的安全功能。接下来咱们来看看它们是如何结合的。安全

3. GenericFilterBean

在该系列的文章开篇我对Spring Security和Shiro进行了简单的对比Spring Security利用了Spring IOCAOP的特性而没法脱离Spring独立存在,而Apache Shiro能够独立存在。因此今天咱们要一探究竟,看看他们是如何结合的。微信

Spring结合Servlet Filter天然是要为Servlet Filter注入Spring Bean的特性,因此就搞出了一个抽象Filter Bean,这个抽象过滤器GenericFilterBean并非在Spring Security下,而是Spring Web体系中,类图以下:学习

image-20200701162747774

从类图上看Filter接口已经被注入了多个Spring Bean的特性,归入了Spring Bean生命周期,使得Spring IoC容器可以充分的管理Filterurl

4. DelegatingFilterProxy

咱们但愿Servlet可以按照它本身的标准来注册到过滤器链中工做,可是同时也但愿它可以被Spring IoC管理,因此Spring提供了一个GenericFilterBean的实现DelegatingFilterProxy。咱们能够将原生的Servlet Filter或者Spring Bean Filter委托给DelegatingFilterProxy,而后在结合到Servlet FilterChain中。spa

DelegatingFilterProxy

5. SecurityFilterChain

针对不一样符合Ant Pattern的请求可能会走不一样的过滤器链,好比登陆会去验证,而后返回登陆结果;管理后台的接口走后台的安全逻辑,应用客户端的接口走客户端的安全逻辑。Spring Security提供了一个SecurityFilterChain接口来知足被匹配HttpServletRequest走特定的过滤器链的需求。3d

public interface SecurityFilterChain {
    // 判断请求 是否符合该过滤器链的要求
   boolean matches(HttpServletRequest request);
    // 对应的过滤器链
   List<Filter> getFilters();
}
复制代码

SecurityFilterChain

6. FilterChainProxy

不一样的SecurityFilterChain应该是互斥并且平等的,它们之间不该该是上下游关系。code

不一样的请求通过不一样的SecurityFilterChain

如上图请求被匹配到不一样的SecurityFilterChain而后在执行剩余的过滤器链。它们通过SecurityFilterChain的总流程是类似的,并且有些时候特定的一些SecurityFilterChain也须要被集中管理来实现特定一揽子的请求的过滤逻辑。因此就有了另一个GenericFilterBean实现来作这个事情,它就是FilterChainProxy。它的做用就是拦截符合条件的请求,而后根据请求筛选出符合要求的SecurityFilterChain,而后链式的执行这些Filter,最后继续执行剩下的FilterChain

扩展阅读:Spring Security 过滤器链

7. 总结

结合上面,最终上述这些概念的关系完全搞清楚了,搞清楚过滤器的运做模式对于学习和使用Spring Security相当重要。

Spring Security Servlet过滤器链组织关系

多多关注微信公众号:码农小胖哥 获取更多的技术干货。六月打榜结果已出请中奖的同窗速度联系我领取,另外七月打榜前三会送上热门技术正版实体书籍, 打榜的要求只有一个关注、转发、再看、点赞均可以增长本身的排名。

关注公众号:Felordcn获取更多资讯

我的博客:https://felord.cn

相关文章
相关标签/搜索