如何将 Spring MVC 应用程序与具有 OAuth2.0 安全性的 Spring Cloud Gateway 集成?

K. *_*ddy 1 spring-security oauth-2.0 spring-boot spring-cloud-gateway

我有一个 Spring Boot MVC + Thymeleaf 应用程序,它通过 Spring Cloud Gateway 与一堆微服务进行通信。

mvc_app -> gateway -> (service_a, service_b,...)

现在,我想实现基于 OAuth 2 的安全性,并且希望将身份验证过程集中在网关级别。

这意味着:

  1. 如果用户尝试通过网关访问任何资源服务器(service_a、service_b 等)上的安全资源,网关应将用户重定向到 IdP 登录页面。
  2. 身份验证成功后,网关应使用 accessToken 来访问受保护的资源。

这可以通过以下方式实现:

  1. spring-boot-starter-oauth2-client使用适当的提供者/客户端配置将网关设置为 OAuth 2 客户端
  2. 使用TokenRelay过滤器将AccessToken转发到下游resource_servers。

问题:

当您通过网关进行身份验证时,身份验证状态将在网关应用程序级别维护。网关成功验证后,如何发回 AccessToken、IdToken 以便mvc_app进一步请求时使用相同的 AccessToken?

ch4*_*4mp 5

您可能应该重新考虑您的意图:您希望使用TokenRelay过滤器在使用会话保护的前端和使用令牌(资源服务器)保护的微服务之间建立桥梁,但是您希望向前端提供令牌。重点是什么?

您的 Spring MVC 前端可以是可靠的 OAuth2 客户端。您应该将其配置为 OAuth2“机密”客户端(使用oauth2login),并使网关对安全性透明(什么都没有)。

Spring REST 客户端(WebClientRestTemplate@FeignClient,甚至是新的RestClient)都被设计为与授权客户端存储库集成,并在会话中使用访问令牌透明地填充授权标头。有关详细信息,请参阅您选择的产品的手册。

当前端是 SPA(Angular、React、Vue 等)或本机应用程序时,将网关配置为具有登录和过滤器的 OAuth2 客户端TokenRelay很有意义,因为它不能是机密客户端。实际上,您不想为此类应用程序提供 OAuth2 令牌:您仅使用会话(和 CSRF)cookie 对其进行授权,并在服务器上保持令牌安全。