|
此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Security 7.0.4! |
OAuth 2.0 资源服务器
Spring Security 支持使用两种形式的 OAuth 2.0 Bearer Token 来保护端点:
-
不透明Tokens
这在应用程序将其权限管理委托给授权服务器(例如 Okta 或 Ping Identity)的情况下非常有用。 资源服务器可以向该授权服务器查询以对请求进行授权。
本节详细介绍了 Spring Security 如何提供对 OAuth 2.0 Bearer Token 的支持。
|
在Spring Security 示例仓库中提供了针对JWT和不透明Tokens(Opaque Tokens)的可用示例。 |
现在我们可以探讨 Bearer Token 认证在 Spring Security 中的工作原理。 首先,我们注意到,与基本认证(Basic Authentication)一样,WWW-Authenticate 响应头会被发送给未经认证的客户端:
上图基于我们的 SecurityFilterChain 图表构建。
首先,用户向/private用户无权访问的资源。
Spring Security 的AuthorizationFilter表示未认证的请求是拒绝访问通过抛出AccessDeniedException.
由于用户未通过身份验证,ExceptionTranslationFilter启动开始身份验证.
已配置的AuthenticationEntryPoint是BearerTokenAuthenticationEntryPoint,它发送一个WWW-Authenticate头部。
TheRequestCache通常是NullRequestCache由于客户端能够重放其最初请求的请求,因此不会保存该请求。
当客户端收到 WWW-Authenticate: Bearer 响应头时,它就知道应该使用 Bearer Token 重试请求。
下图展示了 Bearer Token 的处理流程:
该图基于我们的 SecurityFilterChain 图表构建。
当用户提交其承载Tokens时,BearerTokenAuthenticationFilter创建BearerTokenAuthenticationToken这是一种Authentication通过从HttpServletRequest.
接下来,HttpServletRequest被传递给AuthenticationManagerResolver,它选择AuthenticationManager。TheBearerTokenAuthenticationToken被传递到AuthenticationManager需要身份验证。
详细信息如下AuthenticationManager看起来取决于您是否已配置为jwt or 不透明Tokens.
如果身份验证失败,则失败
-
SecurityContextHolder 已被清空。
-
AuthenticationEntryPoint被调用以触发再次发送 WWW-Authenticate 头。
如果认证成功,则成功.
-
任何已认证的
Authentication在SecurityContextHolder中都会被加载,其权限将被添加到返回的Authentication中。 -
Authentication 被设置到 SecurityContextHolder 上。
-
BearerTokenAuthenticationFilter调用FilterChain.doFilter(request,response)以继续执行应用程序的其余逻辑。