[spring-projects/spring-boot]ReactiveOAuth2ClientAutoConfiguration 应该在 Servlet 环境中使用

2024-05-14 518 views
8
14463 引入了关于响应式 OAuth2 自动配置支持的条件,该条件对 Servlet 应用程序禁用它。由于 Spring 团队决定不对 RestTemplate 提供任何 OAuth2 支持,因此 Servlet 应用程序中也勉强需要 WebClient 支持。这种自动配置仅涵盖客户端支持,不应仅仅因为它在传统应用程序中运行而将其禁用。

回答

7

@chrylisReactiveOAuth2ClientAutoConfiguration已正确实施。

它将有条件地@Bean注册ReactiveClientRegistrationRepositoryReactiveOAuth2AuthorizedClientServiceServerOAuth2AuthorizedClientRepository

这些是 WebFlux 组件,因此只能在 WebFlux 环境中注册。

尽管不会添加新功能,但RestTemplate它不会很快消失。鉴于它的广泛使用,它可能会在相当长的一段时间内得到支持。

在应用程序中同时使用RestTemplate和是常见的做法。WebClientoauth2-client

仅供参考,请看一下这个示例,它演示了客户端、授权服务器和资源服务器之间使用的常见实现模式和流程。

0

我正在编写一个传统的 HTML 应用程序,需要用来client_credentials从资源服务器访问信息。 Spring Security 5 OAuth2 仅提供令牌注入支持WebClient(通过ServerOAuth2AuthorizedClientExchangeFilterFunction),而不是RestTemplate(与前者一样OAuth2RestTemplate),并且使用该过滤器需要 aReactiveOAuth2AuthorizedClientManagerReactiveClientRegistrationRepositoryServerOAuth2AuthorizedClientRepository。在语义上没有任何东西将其限制在 WebFlux 环境中。

WebClient(请注意,在链接的示例中, Servlet 环境中的相关用例是 404。)

8

我们已经作为一个团队讨论过这个问题,我将在这里分享不同的方面:

首先:WebClient是模块的一部分spring-webflux,但不一定与 WebFlux Web 应用程序绑定。可以说,框架团队选择WebClientspring-webfluxRestTemplate中托管该类spring-web,这使得这里的事情变得更加困难 - 但我将框架团队当前的立场总结如下:

RestTemplate已置于维护模式。它并未被弃用,并且将保留在 Framework 6.x 系列中。该团队不会改进其合约,也不会解决数据流等现代 HTTP 用例。

现在,类路径上同时具有 和 的 Spring Boot 应用程序spring-mvcspring-webflux生成 Spring MVC 服务器应用程序。但 Spring Boot 仍然会贡献一个WebClient.Builderbean,因为WebClient在 Spring MVC 应用程序中使用 bean 不仅是一个完全有效的用例,框架团队还宣传它是一种熟悉响应式并解决RestTemplate流等限制的方法。

考虑到这一点,我们想知道:

  1. 我们是否应该删除阻止响应式变体在 MVC 范围之外注册的条件?
  2. 在这种情况下,这是否会阻止开发人员在非 Web 用例中使用该组件?换句话说,ReactiveOAuth2Client组件是否应该可供 CLI 应用程序使用?
  3. 听起来 @chrylis 是说该组件的RestTemplateWebClient变体不提供相同的功能。这与 的特定限制有关吗RestTemplate
  4. 如果反应式+非反应式变体在应用程序上下文中都可用,会发生什么? Spring Security 在特定情况下会失败吗?组件是否会错过工作基础架构的某些重要部分(在 MVC、WebFlux 或 CLI 应用程序案例中)
6

@jgrandja @rwinch 您能否对 Brian 的评论中的第 3 点和第 4 点提供更多见解?

4

听起来 @chrylis 是说该组件的 RestTemplate 和 WebClient 变体不提供相同的功能。这是否与 RestTemplate 的特定限制有关?

正确的。 WebClient API 允许传入属性,但 RestTemplate 不允许。 OAuth 功能依赖于属性。更重要的是,如果 RestTemplate 处于维护模式,我认为安全团队利用我们的时间为其提供 OAuth 支持是没有意义的(据记录没有向其添加任何功能)。

如果反应式+非反应式变体在应用程序上下文中都可用,会发生什么? Spring Security 在特定情况下会失败吗?

我不确定我是否遵循这个问题,因为我不确定具体变体指的是什么。

3

我不确定我是否遵循这个问题,因为我不确定具体变体指的是什么。

ReactiveOAuth2ClientAutoConfiguration它指的是打开由和配置的bean OAuth2ClientAutoConfiguration。但是,我认为这不会产生影响,因为ReactiveOAuth2ClientAutoConfiguration正如 @jgrandja 指出的那样,配置的 bean 仅在 webflux 应用程序中使用,而自动配置的 beanOAuth2ClientAutoConfiguration仅在 servlet 环境中使用。

WebClient API 允许传入属性,但 RestTemplate 不允许。 OAuth 功能依赖于属性。

WebClient@rwinch 鉴于此,在 servlet 应用程序中使用 OAuth2 请求的最佳方法是什么?

6

所以我很清楚,我在这里的评论专门讨论 Spring Security 5 OAuth2 客户端与 Spring REST 客户端的集成,提供诸如“在 Spring Boot 配置中声明 OAuth2 客户端配置并让它自动向 REST 提供访问令牌”之类的功能要求”。

1-2。该条件不会阻止在响应式 Web 应用程序之外进行注册;相反,它专门阻止Servlet应用程序内的注册。目前,在完全非 Web 应用程序中使用不是问题;在这种情况下,自动令牌过滤器不会获取凭证来中继传入的请求,但client_credentials会正常运行(例如,对于 Quartz 或消息驱动的应用程序)。

  1. 旧的“Spring Security OAuth2 2”被“Spring Security 5 OAuth2”取代,删除了子类OAuth2RestTemplate(这种猴子修补的 OAuth2 支持 RestTemplate),并且它支持使用过滤器的 WebClient,但不提供等效的 RestTemplate 拦截器。配置此 WebClient 过滤器需要讨论的 bean 依赖关系。
1

更重要的是,如果RestTemplate处于维护模式

这里不是重新开始特定讨论的地方,但我相信 Spring 团队对于即将到来的将响应式作为默认处理方式的临界点过于乐观,并且放弃了对 90% 以上项目的支持方式。写的……令人沮丧。

5

@mbhave 您正在将使用 Webflux 提供内容的应用程序使用 Webflux 消费内容的应用程序混为一谈。我有一个 Servlet 应用程序,使用 MVC 来提供内容,但使用 WebClient 来使用内容。

0

它指的是打开由 ReactiveOAuth2ClientAutoConfiguration 和 OAuth2ClientAutoConfiguration 配置的 beans。但是,我认为这不会产生影响,因为由 ReactiveOAuth2ClientAutoConfiguration 配置的 beans 仅在 webflux 应用程序中使用,正如@jgrandja 指出的那样,而由 OAuth2ClientAutoConfiguration 自动配置的 beans 仅在 servlet 环境中使用。

我还没有弄清楚这些自动配置的作用,但它们不应该执行反应式 WebClientservlet WebClient设置的步骤。此外,我们不能在 servlet 环境中调用 ServerHttpSecurity 。

@rwinch 鉴于此,在 servlet 应用程序中使用 WebClient 进行 OAuth2 请求的最佳方法是什么?

这些说明位于Servlet 环境的 WebClient 集成中。我想知道我是否遗漏了你问题的一部分?您是否想知道什么会导致其设置?如果是这样,我认为仅 OAuth + Servlet 环境就足以设置它。

0

感谢上面的链接,@rwinch。

@chrylis 我不会将两者混为一谈。如果是的话,我就会关闭这个问题,并且不会让团队进行进一步的讨论。

对于这句话

Spring Security 5 OAuth2 仅为 WebClient 提供令牌注入支持(通过 ServerOAuth2AuthorizedClientExchangeFilterFunction),而不是 RestTemplate(与以前的 OAuth2RestTemplate 一样),并且使用该过滤器需要 ReactiveOAuth2AuthorizedClientManager 或 ReactiveClientRegistrationRepository 和 ServerOAuth2AuthorizedClientRepository

这个评论来看,据我所知,这是不准确的。 Servlet 环境的 WebClient 集成可以通过 a 进行配置ServletOAuth2AuthorizedClientExchangeFilterFunction,这需要 aOAuth2AuthorizedClientManagerClientRegistrationRepositoryOAuth2AuthorizedClientRepository。这些是由OAuth2ClientAutoConfigurationservlet 应用程序自动配置的。此示例展示了如何在 servlet 应用程序中为 WebClient 配置 OAuth2。您能解释一下为什么这个设置不适合您吗?

0

由于缺乏所需的反馈而关闭。如果您希望我们查看此问题,请提供所需的信息,我们将重新打开该问题。