Spring Boot 2.1.5.RELEASE Spring Security 版本:5.1.5-RELEASE Spring Security 官方文档
基于 Servlet Security 从整体架构上了解:Authentication(身份认证)、Authorization(授权)、Protection Against Exploits(常规漏洞防范)。
一、从 Filter 开始
1.1、从 Filter 开始
在以 Servlet 为容器的应用中,Spring Security 的实现基于标准的 Servlet Filter。
所以学习了解 Spring Security 要从 Filter 开始。
首先来看一张图,下图是处理当个请求时,Servlet Filter 处理的典型分层
Client 发送一个请求到应用中。
Servlet 容器会创建 FilterChain , FilterChain 包含了 所有的 Filter 和 Servlet 。并以此处理请求 URL。
由于 FilterChain 可以包含多个 Filter ,上游的 Filter 回影响到下游的 Filter 和 Servlet 的执行,所以 Filter 的顺序很重要。
1.2、Spring Security 不一样的 Filter

在 Spring Security Servlet 实现中,Spring Security 通过几组定义丰富了Filter 实现。
- DelegatingFilterProxy(委托过滤代理)
DelegatingFilterProxy 持有 FilterChainProxy
并实现了如下接口- Filter
- InitializingBean
- EnvironmentAware
- FilterChainProxy(过滤链代理)
FilterChainProxy 持有多个 SecurityFilterChain - SecurityFilterChain(安全过滤器链)
SecurityFilterChain 持有了真正实现处理逻辑的过滤器 Filter 列表。
SecurityFilterChain 中多个 Filter 的执行顺序:文档二、Handling Security Exceptions
针对安全认证等异常 Spring Security 提供了ExceptionTranslationFilter进行处理。ExceptionTranslationFilter能够处理将AccessDeniedException和AuthenticationException转换成 HTTP 响应返回。ExceptionTranslationFilter作为一个 Security Filters 被FilterChainProxy持有。2.1、ExceptionTranslationFilter 处理流程

只有当程序抛出 AccessDeniedException 和 AuthenticationException ,ExceptionTranslationFilter 才会处理。
三、Authentication
3.1、architecture components
SecurityContextHolder
存放已认证用户信息SecurityContext
从SecurityContextHolder获得,包含当前经过身份验证的用户的身份验证信息。Authentication
可以是AuthenticationManager的输入,也可以是SecurityContext中当前用户 提供的已认证过的用户凭证。GranteAuthority
在身份认证过程中被授予主体的权限。AuthenticationManager
API 定义:Spring Security 如何进行身份认证。ProviderManagerAuthenticationManager最常见的实现。AuthenticationProvider
使用ProviderManager进行特殊类型的身份认证。Request Credentials with AuthenticationEntryPoint
用于从客户端获取凭证AbstractAuthenticationProcessingFilter
用于身份认证的基础 Filter。
通过该类能够了解身份认证流程及各个组件间的流程关系。
3.2、Authentication Mechanisms
Spring Security 提供的认证机制
- Username and Password
- OAuth 2.0 Login
- SAML 2.0 Login
- Central Authentication Server (CAS)
- Remember Me
- JAAS Authentication
- OpenID
- Pre-Authentication Scenarios
- X509 Authentication
