Spring Security Servlet 安全架构

1. 前言

在上一节中,我们演示了如何快速搭建 Spring Security 项目,本节将主要讨论 Spring Security 安全框架的组成。

在前文中提到,Spring Security 设计的 Servlet 安全从架构上分为三个层次,分别是「认证」、「鉴权」、「入侵防护」。那 Spring Security 是通过什么方法将安全逻辑应用到 Servlet 项目中呢?答案就是 Servlet 的过滤器机制。

我们知道,在 Servlet 项目中,请求的接收和处理是通过一个一个的过滤器顺序执行实现的,过滤器是 Servlet 项目处理请求的基础。Spring 则通过委托代理的机制,将 Servlet 和 Spring 框架的 ApplicationContext 对象相互连通。Spring Security 借助 Spring 的委托代理插入了安全框架的内容。也就是说,Spring 向 Servlet 工程中插入了一个自己的过滤器,用来扩展出 Spring 的各项功能,Spring Security 又向 Spring 中插入了自己的过滤器,实现了安全功能。

本节主要讨论 Spring Security 在 Servlet 项目中的实现思路。

2. Servlet 项目中的过滤器(Filter)

每当客户端向 Servlet 服务端发起请求,该请求在被 Servlet 执行前,会经过一系列的过滤器,这些过滤器有两个主要功能:

  1. 阻止后续过滤器或者 Servlet 的执行;
  2. 修改 HttpServletRequest 或者 HttpServletResponse 的内容,提供后续的过滤器或者 Servlet 使用。

每一个过滤器的作用都是为了影响后续过滤器的执行,所以 Filter 的执行顺序非常重要,而决定它们顺序关系的便是过滤器链(Filter Chain)。

图片描述

图1. 过滤器链

3. Spring 的过滤器委托代理机制

Spring 提供了一个名为 DelegatingFilterProxy 的过滤器。这个过滤器的作用是连接 Servlet 项目中 Servlet 容器和 Spring 项目的核心上下文对象(ApplicationContext)。Servlet 容器允许对其过滤器做自定义的扩展,DelegatingFilterProxy 将 Spring 的 Bean 过滤器(Bean Filter)插入到 Servlet 的过滤器链中执行。

图片描述

图2. Spring 的过滤器委托代理

4. Spring Security 安全过滤器

4.1 加入安全过滤器

Spring Security 的 Servlet 支持是通过过滤器链代理(FilterChainProxy)对象实现的。FilterChainProxy 同样也是一个过滤器,被封装在 Spring 的过滤器委托代理(DelegatingFilterProxy)中。其过程如图:

图片描述

图3. 过滤器链代理

4.2 安全过滤器链

安全过滤器链(SecurityFilterChain)用在 FilterChainProxy 上,其作用是觉得用于处理安全的过滤器们的执行顺序。如图:

图片描述

图4. 安全过滤器链

安全过滤器链(SecurityFilterChain)是注册在过滤器链代理(FilterChainProxy)上的,有以下几个特点:

  1. 为所有 Spring Security 支持的 Servlet 指明了起点;
  2. 对于一些后台操作,可以提升执行效率;
  3. 在 Servlet 容器中,过滤器的选择是由 URL 决定的,如此便可针对不同 URL 指定相互独立的安全策略。

图片描述

图5. 多个安全过滤器链代理并存

有时,我们需要对不同的 URL 做不同的安全处理,就可以通过加入多个安全过滤链实现,比如上图中 SecurityFilterChain0/api/** 请求有 3 个安全过滤器处理,SecurityFilterChain1/** 等其他请求有 4 个安全过滤器的处理。每一个安全过滤器链都是独立的、唯一的且不会重复执行的。

5. 小结

本节我们介绍了 Spring Security 安全架构的设计理念,本节主要知识点如下:

  • Servlet 项目基于「过滤器」方式实现功能扩展;
  • Spring 项目扩展了「Servlet 过滤器」,增加了自己的「过滤器代理」;
  • Spring Security 项目扩展了「Spring 过滤器」,在「Spring 过滤器代理」中加入了安全过滤器;
  • Spring Security 项目通过构建一系列的「安全过滤器」实现系统的安全保护能力。

下一节将讨论 Spring Security 中内置的过滤器作用及其顺序。