在上一节中,我们演示了如何快速搭建 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 项目中的实现思路。
每当客户端向 Servlet 服务端发起请求,该请求在被 Servlet 执行前,会经过一系列的过滤器,这些过滤器有两个主要功能:
每一个过滤器的作用都是为了影响后续过滤器的执行,所以 Filter 的执行顺序非常重要,而决定它们顺序关系的便是过滤器链(Filter Chain)。
Spring 提供了一个名为 DelegatingFilterProxy 的过滤器。这个过滤器的作用是连接 Servlet 项目中 Servlet 容器和 Spring 项目的核心上下文对象(ApplicationContext)。Servlet 容器允许对其过滤器做自定义的扩展,DelegatingFilterProxy 将 Spring 的 Bean 过滤器(Bean Filter)插入到 Servlet 的过滤器链中执行。
Spring Security 的 Servlet 支持是通过过滤器链代理(FilterChainProxy)对象实现的。FilterChainProxy 同样也是一个过滤器,被封装在 Spring 的过滤器委托代理(DelegatingFilterProxy)中。其过程如图:
安全过滤器链(SecurityFilterChain)用在 FilterChainProxy 上,其作用是觉得用于处理安全的过滤器们的执行顺序。如图:
安全过滤器链(SecurityFilterChain)是注册在过滤器链代理(FilterChainProxy)上的,有以下几个特点:
有时,我们需要对不同的 URL 做不同的安全处理,就可以通过加入多个安全过滤链实现,比如上图中 SecurityFilterChain0 对 /api/**
请求有 3 个安全过滤器处理,SecurityFilterChain1 对 /**
等其他请求有 4 个安全过滤器的处理。每一个安全过滤器链都是独立的、唯一的且不会重复执行的。
本节我们介绍了 Spring Security 安全架构的设计理念,本节主要知识点如下:
下一节将讨论 Spring Security 中内置的过滤器作用及其顺序。
0/1000