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)继续执行应用程序的其余逻辑。