OAuth 2.0 资源服务器

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

  • JWT

  • 不透明令牌

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

本节详细介绍 Spring Security 如何支持 OAuth 2.0 Bearer 令牌

Spring Security 示例仓库 中提供了 JWT不透明令牌 的可用工作示例。

现在我们可以考虑 Bearer 令牌认证在 Spring Security 中如何工作。首先,我们看到,与 Basic 认证 一样,WWW-Authenticate 头会被发送回未认证的客户端

bearerauthenticationentrypoint
图 1. 发送 WWW-Authenticate 头

上图基于我们的 SecurityFilterChain 图。

数字 1 首先,用户对 /private 资源发起一个未经认证的请求,该用户未被授权访问此资源。

数字 2 Spring Security 的 AuthorizationFilter 通过抛出 AccessDeniedException 来指示未经认证的请求被 拒绝

数字 3 由于用户未被认证,ExceptionTranslationFilter 启动 开始认证。配置的 AuthenticationEntryPointBearerTokenAuthenticationEntryPoint 的一个实例,它发送 WWW-Authenticate 头。RequestCache 通常是一个 NullRequestCache,它不会保存请求,因为客户端能够重放其最初请求的请求。

当客户端收到 WWW-Authenticate: Bearer 头时,它知道应该使用 bearer 令牌重试。下图展示了 bearer 令牌处理流程

bearertokenauthenticationfilter
图 2. 认证 Bearer 令牌

该图基于我们的 SecurityFilterChain 图。

数字 1 当用户提交其 bearer 令牌时,BearerTokenAuthenticationFilter 通过从 HttpServletRequest 中提取令牌来创建 BearerTokenAuthenticationToken,它是一种 Authentication 类型。

数字 2 接下来,HttpServletRequest 被传递给 AuthenticationManagerResolver,它选择 AuthenticationManagerBearerTokenAuthenticationToken 被传递到 AuthenticationManager 进行认证。AuthenticationManager 的具体形式取决于您是配置为 JWT 还是 不透明令牌

数字 3 如果认证失败,则 失败

  • SecurityContextHolder 被清空。

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

数字 4 如果认证成功,则 成功

  • Authentication 被设置到 SecurityContextHolder 上。

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