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

栏目: IT技术 · 发布时间: 4年前

内容简介:我在这里我们以

1. 前言

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

2. Servlet Filter体系

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

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

Filter 不但可以修改 HttpServletRequestHttpServletResponse ,可以让我们在请求响应的前后做一些事情,甚至可以终止过滤器链 FilterChain 的传递。

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 体系中,类图如下:

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

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

4. DelegatingFilterProxy

我们希望 Servlet 能够按照它自己的标准来注册到过滤器链中工作,但是同时也希望它能够被 Spring IoC 管理,所以Spring提供了一个 GenericFilterBean 的实现 DelegatingFilterProxy 。我们可以将原生的 Servlet Filter 或者 Spring Bean Filter 委托给 DelegatingFilterProxy ,然后在结合到 Servlet FilterChain 中。

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

5. SecurityFilterChain

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

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

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

6. FilterChainProxy

不同的 SecurityFilterChain 应该是互斥而且平等的,它们之间不应该是上下游关系。

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

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

扩展阅读: Spring Security 过滤器链

7. 总结

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

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

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

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

个人博客:https://felord.cn


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

疯狂Java讲义

疯狂Java讲义

李刚 / 电子工业出版社 / 2008-10 / 99.00元

《疯狂Java讲义》2000年至今,Java语言一直是应用最广的开发语言,并拥有最广泛的开发人群。如今,Java已经不再简单地是一门语言,它更像一个完整的体系,一个系统的开发平台。更甚至,它被延伸成一种开源精神。 《疯狂Java讲义》深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编......一起来看看 《疯狂Java讲义》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码