OAuth 2.0 资源服务器
Spring Security 支持通过两种形式的 OAuth 2.0 Bearer Tokens 来保护端点:
- JWT
- 不透明令牌
这在应用程序将其权限管理委托给授权服务器(例如Okta或Ping Identity)的场景中非常方便。资源服务器可以咨询该授权服务器来对请求进行授权。
本节详细介绍了 Spring Security 如何为 OAuth 2.0 Bearer Tokens 提供支持。
JWT 和 Opaque Token 的示例代码均可在 Spring Security Samples 仓库 中找到。
现在我们可以探讨 Bearer Token 认证在 Spring Security 中的工作原理。首先可以看到,与基础认证类似,当客户端未通过认证时,服务器会返回 WWW-Authenticate 响应头:

图 1. 发送 WWW-Authenticate 标头
上图基于我们的SecurityFilterChain示意图构建。
1 首先,用户向 /private 资源发出未经身份验证的请求,而该用户未被授权访问此资源。
2 Spring Security 的 AuthorizationFilter 通过抛出 AccessDeniedException 来表明未认证的请求被拒绝。
3 由于用户未经认证,ExceptionTranslationFilter 启动了开始认证流程。配置的 AuthenticationEntryPoint 是 BearerTokenAuthenticationEntryPoint 的一个实例,它会发送一个 WWW-Authenticate 响应头。RequestCache 通常是一个 NullRequestCache,它不会保存请求,因为客户端有能力重放其最初发出的请求。
当客户端收到 WWW-Authenticate: Bearer 头时,它就知道应该使用承载令牌重试请求。下图展示了承载令牌的处理流程:

图 2. 验证 Bearer Token
该图基于我们的SecurityFilterChain示意图构建。
1 当用户提交其承载令牌时,BearerTokenAuthenticationFilter 会通过从 HttpServletRequest 中提取令牌来创建一个 BearerTokenAuthenticationToken,这是一种 Authentication 类型。
2 接下来,HttpServletRequest 被传递给 AuthenticationManagerResolver,由其选择相应的 AuthenticationManager。随后,BearerTokenAuthenticationToken 被传入 AuthenticationManager 进行身份验证。关于 AuthenticationManager 的具体实现细节,取决于您配置的是 JWT 还是 opaque token。
3 如果身份验证失败,则 Failure
-
调用
AuthenticationEntryPoint以再次触发发送 WWW-Authenticate 头信息。
4 如果认证成功,则显示 成功。
-
加载 SecurityContextHolder 中任何已认证的
Authentication,并将其权限添加到返回的 Authentication 中。 -
将 Authentication 设置到 SecurityContextHolder 上。
-
BearerTokenAuthenticationFilter调用FilterChain.doFilter(request,response)以继续执行应用程序的其余逻辑。
章节总结
📄️ JWT
大多数资源服务器的支持功能都集成在 spring-security-oauth2-resource-server 中。然而,JWT 的解码与验证支持位于 spring-security-oauth2-jose 模块内,这意味着要构建一个支持 JWT 编码承载令牌的功能完整的资源服务器,这两个模块都是必需的。
📄️ 不透明令牌
如《JWT 最小依赖项》所述,资源服务器的大部分支持功能都集中在 spring-security-oauth2-resource-server 模块中。然而,除非提供自定义的 OpaqueTokenIntrospector,否则资源服务器将回退到使用 SpringOpaqueTokenIntrospector。这意味着,要构建一个支持不透明承载令牌的最小化可运行资源服务器,仅需引入 spring-security-oauth2-resource-server 即可。
📄️ 多租户
在某些情况下,您可能需要同时访问两种类型的令牌。例如,您可能支持多个租户,其中一个租户颁发 JWT,而另一个租户颁发不透明令牌。
📄️ Bearer Tokens
默认情况下,资源服务器会在 Authorization 头部中查找承载令牌。不过,您可以通过多种方式自定义此行为。
📄️ DPoP 绑定的访问令牌
RFC 9449 OAuth 2.0 持有证明演示(DPoP)是一种用于对访问令牌进行发送方约束的应用层机制。
📄️ 受保护资源元数据
OAuth2ResourceServerConfigurer.ProtectedResourceMetadataConfigurer 提供了自定义 OAuth 2.0 受保护资源元数据端点的能力。它定义了一个扩展点,允许您自定义 OAuth 2.0 受保护资源元数据的响应。