OAuth 2.0 资源服务器

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

Spring Security支持通过使用两种形式的OAuth 2.0 Bearer Token 来保护端点。

  • JWT

  • Opaque (不透明)Token

在应用程序将其权限管理委托给 授权服务器(例如,Okta或Ping Identity)的情况下,这很方便。资源服务器可以查询这个授权服务器来授权请求。

本节详细介绍Spring Security如何为OAuth Bearer Token 提供支持。

JWTOpaque Token 的示例都可以在 Spring Security Samples仓库中找到。

现在我们可以考虑 Bearer Token 认证是如何在Spring Security中工作的。首先,我们看到,与 Basic Authentication 一样, WWW-Authenticate 头被响应给未认证的客户端。

bearerauthenticationentrypoint
Figure 1. Sending WWW-Authenticate Header

上图建立在我们的 SecurityFilterChain 图上。

number 1 首先,用户向未经授权的 /private 资源发出未经认证的请求。

number 2 Spring Security 的 AuthorizationFilter 通过抛出一个 AccessDeniedException 来表明未经认证的请求被拒绝了。

number 3 由于用户没有经过认证,ExceptionTranslationFilter 启动了开始认证。配置的 AuthenticationEntryPointBearerTokenAuthenticationEntryPoint 的一个实例,它发送一个 WWW-Authenticate 头。RequestCache 通常是一个不保存请求的 NullRequestCache,因为客户端有能力重放它最初请求的请求。

当客户端收到 WWW-Authenticate: Bearer header时,它知道它应该用一个 bearer token 重试。下面的图片显示了正在处理的 bearer token 的流程。

bearertokenauthenticationfilter
Figure 2. Authenticating Bearer Token

该图建立在我们的 SecurityFilterChain 图上。

number 1 当用户提交他们的 bearer token 时,BearerTokenAuthenticationFilter 通过从 HttpServletRequest 中提取令牌,创建一个 BearerTokenAuthenticationToken,这是一种 Authentication 类型。

number 2 接下来,HttpServletRequest 被传递给 AuthenticationManagerResolver,它选择了 AuthenticationManagerBearerTokenAuthenticationToken 被传入 AuthenticationManager 以进行认证。AuthenticationManager 的细节取决于你配置的是 JWT 还是 opaque token

number 3 如果认证失败,那么 Failure。

  • SecurityContextHolder 被清空。

  • AuthenticationEntryPoint 被调用以触发 WWW-Authenticate 头的再次发送。

number 4 如果认证成功,则 Success。

  • The Authentication 被设置在 SecurityContextHolder 上。

  • BearerTokenAuthenticationFilter 调用 FilterChain.doFilter(request,response) 来继续执行其余的应用逻辑。