OAuth 2.0 资源服务器
Spring Security 通过使用两种形式的 OAuth 2.0 Bearer 令牌 来支持保护端点
-
不透明令牌
在应用程序将其权限管理委托给授权服务器(例如 Okta 或 Ping Identity)的情况下,这会很方便。资源服务器可以咨询该授权服务器来授权请求。
本节详细介绍 Spring Security 如何支持 OAuth 2.0 Bearer 令牌。
Spring Security 示例仓库 中提供了 JWT 和 不透明令牌 的可用工作示例。 |
现在我们可以考虑 Bearer 令牌认证在 Spring Security 中如何工作。首先,我们看到,与 Basic 认证 一样,WWW-Authenticate 头会被发送回未认证的客户端

上图基于我们的 SecurityFilterChain
图。
首先,用户对
/private
资源发起一个未经认证的请求,该用户未被授权访问此资源。
Spring Security 的
AuthorizationFilter
通过抛出 AccessDeniedException
来指示未经认证的请求被 拒绝。
由于用户未被认证,
ExceptionTranslationFilter
启动 开始认证。配置的 AuthenticationEntryPoint
是 BearerTokenAuthenticationEntryPoint
的一个实例,它发送 WWW-Authenticate
头。RequestCache
通常是一个 NullRequestCache
,它不会保存请求,因为客户端能够重放其最初请求的请求。
当客户端收到 WWW-Authenticate: Bearer
头时,它知道应该使用 bearer 令牌重试。下图展示了 bearer 令牌处理流程

该图基于我们的 SecurityFilterChain
图。
当用户提交其 bearer 令牌时,
BearerTokenAuthenticationFilter
通过从 HttpServletRequest
中提取令牌来创建 BearerTokenAuthenticationToken
,它是一种 Authentication
类型。
接下来,
HttpServletRequest
被传递给 AuthenticationManagerResolver
,它选择 AuthenticationManager
。BearerTokenAuthenticationToken
被传递到 AuthenticationManager
进行认证。AuthenticationManager
的具体形式取决于您是配置为 JWT 还是 不透明令牌。
如果认证失败,则 失败
-
SecurityContextHolder
被清空。 -
调用
AuthenticationEntryPoint
以再次触发发送 WWW-Authenticate 头。
如果认证成功,则 成功。
-
Authentication 被设置到 SecurityContextHolder 上。
-
BearerTokenAuthenticationFilter
调用FilterChain.doFilter(request,response)
继续执行应用程序的其余逻辑。