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 如何进行身份认证。ProviderManager
AuthenticationManager
最常见的实现。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