[spring-projects/spring-boot]ReactiveOAuth2ClientAutoConfiguration 应该在 Servlet 环境中使用
回答
@chrylisReactiveOAuth2ClientAutoConfiguration
已正确实施。
它将有条件地@Bean
注册ReactiveClientRegistrationRepository
、ReactiveOAuth2AuthorizedClientService
和ServerOAuth2AuthorizedClientRepository
。
这些是 WebFlux 组件,因此只能在 WebFlux 环境中注册。
尽管不会添加新功能,但RestTemplate
它不会很快消失。鉴于它的广泛使用,它可能会在相当长的一段时间内得到支持。
在应用程序中同时使用RestTemplate
和是常见的做法。WebClient
oauth2-client
仅供参考,请看一下这个示例,它演示了客户端、授权服务器和资源服务器之间使用的常见实现模式和流程。
我正在编写一个传统的 HTML 应用程序,需要用来client_credentials
从资源服务器访问信息。 Spring Security 5 OAuth2 仅提供令牌注入支持WebClient
(通过ServerOAuth2AuthorizedClientExchangeFilterFunction
),而不是RestTemplate
(与前者一样OAuth2RestTemplate
),并且使用该过滤器需要 aReactiveOAuth2AuthorizedClientManager
或ReactiveClientRegistrationRepository
和ServerOAuth2AuthorizedClientRepository
。在语义上没有任何东西将其限制在 WebFlux 环境中。
WebClient
(请注意,在链接的示例中, Servlet 环境中的相关用例是 404。)
我们已经作为一个团队讨论过这个问题,我将在这里分享不同的方面:
首先:WebClient
是模块的一部分spring-webflux
,但不一定与 WebFlux Web 应用程序绑定。可以说,框架团队选择WebClient
在spring-webflux
和RestTemplate
中托管该类spring-web
,这使得这里的事情变得更加困难 - 但我将框架团队当前的立场总结如下:
RestTemplate
已置于维护模式。它并未被弃用,并且将保留在 Framework 6.x 系列中。该团队不会改进其合约,也不会解决数据流等现代 HTTP 用例。
现在,类路径上同时具有 和 的 Spring Boot 应用程序spring-mvc
将spring-webflux
生成 Spring MVC 服务器应用程序。但 Spring Boot 仍然会贡献一个WebClient.Builder
bean,因为WebClient
在 Spring MVC 应用程序中使用 bean 不仅是一个完全有效的用例,框架团队还宣传它是一种熟悉响应式并解决RestTemplate
流等限制的方法。
考虑到这一点,我们想知道:
- 我们是否应该删除阻止响应式变体在 MVC 范围之外注册的条件?
- 在这种情况下,这是否会阻止开发人员在非 Web 用例中使用该组件?换句话说,
ReactiveOAuth2Client
组件是否应该可供 CLI 应用程序使用? - 听起来 @chrylis 是说该组件的
RestTemplate
和WebClient
变体不提供相同的功能。这与 的特定限制有关吗RestTemplate
? - 如果反应式+非反应式变体在应用程序上下文中都可用,会发生什么? Spring Security 在特定情况下会失败吗?组件是否会错过工作基础架构的某些重要部分(在 MVC、WebFlux 或 CLI 应用程序案例中)
@jgrandja @rwinch 您能否对 Brian 的评论中的第 3 点和第 4 点提供更多见解?
听起来 @chrylis 是说该组件的 RestTemplate 和 WebClient 变体不提供相同的功能。这是否与 RestTemplate 的特定限制有关?
正确的。 WebClient API 允许传入属性,但 RestTemplate 不允许。 OAuth 功能依赖于属性。更重要的是,如果 RestTemplate 处于维护模式,我认为安全团队利用我们的时间为其提供 OAuth 支持是没有意义的(据记录没有向其添加任何功能)。
如果反应式+非反应式变体在应用程序上下文中都可用,会发生什么? Spring Security 在特定情况下会失败吗?
我不确定我是否遵循这个问题,因为我不确定具体变体指的是什么。
我不确定我是否遵循这个问题,因为我不确定具体变体指的是什么。
ReactiveOAuth2ClientAutoConfiguration
它指的是打开由和配置的bean OAuth2ClientAutoConfiguration
。但是,我认为这不会产生影响,因为ReactiveOAuth2ClientAutoConfiguration
正如 @jgrandja 指出的那样,配置的 bean 仅在 webflux 应用程序中使用,而自动配置的 beanOAuth2ClientAutoConfiguration
仅在 servlet 环境中使用。
WebClient API 允许传入属性,但 RestTemplate 不允许。 OAuth 功能依赖于属性。
WebClient
@rwinch 鉴于此,在 servlet 应用程序中使用 OAuth2 请求的最佳方法是什么?
所以我很清楚,我在这里的评论专门讨论 Spring Security 5 OAuth2 客户端与 Spring REST 客户端的集成,提供诸如“在 Spring Boot 配置中声明 OAuth2 客户端配置并让它自动向 REST 提供访问令牌”之类的功能要求”。
1-2。该条件不会阻止在响应式 Web 应用程序之外进行注册;相反,它专门阻止Servlet应用程序内的注册。目前,在完全非 Web 应用程序中使用不是问题;在这种情况下,自动令牌过滤器不会获取凭证来中继传入的请求,但client_credentials
会正常运行(例如,对于 Quartz 或消息驱动的应用程序)。
- 旧的“Spring Security OAuth2 2”被“Spring Security 5 OAuth2”取代,删除了子类
OAuth2RestTemplate
(这种猴子修补的 OAuth2 支持 RestTemplate),并且它支持使用过滤器的 WebClient,但不提供等效的 RestTemplate 拦截器。配置此 WebClient 过滤器需要讨论的 bean 依赖关系。
更重要的是,如果RestTemplate处于维护模式
这里不是重新开始特定讨论的地方,但我相信 Spring 团队对于即将到来的将响应式作为默认处理方式的临界点过于乐观,并且放弃了对 90% 以上项目的支持方式。写的……令人沮丧。
@mbhave 您正在将使用 Webflux 提供内容的应用程序和使用 Webflux 消费内容的应用程序混为一谈。我有一个 Servlet 应用程序,使用 MVC 来提供内容,但使用 WebClient 来使用内容。
它指的是打开由 ReactiveOAuth2ClientAutoConfiguration 和 OAuth2ClientAutoConfiguration 配置的 beans。但是,我认为这不会产生影响,因为由 ReactiveOAuth2ClientAutoConfiguration 配置的 beans 仅在 webflux 应用程序中使用,正如@jgrandja 指出的那样,而由 OAuth2ClientAutoConfiguration 自动配置的 beans 仅在 servlet 环境中使用。
我还没有弄清楚这些自动配置的作用,但它们不应该执行反应式 WebClient和servlet WebClient设置的步骤。此外,我们不能在 servlet 环境中调用 ServerHttpSecurity 。
@rwinch 鉴于此,在 servlet 应用程序中使用 WebClient 进行 OAuth2 请求的最佳方法是什么?
这些说明位于Servlet 环境的 WebClient 集成中。我想知道我是否遗漏了你问题的一部分?您是否想知道什么会导致其设置?如果是这样,我认为仅 OAuth + Servlet 环境就足以设置它。
感谢上面的链接,@rwinch。
@chrylis 我不会将两者混为一谈。如果是的话,我就会关闭这个问题,并且不会让团队进行进一步的讨论。
对于这句话
Spring Security 5 OAuth2 仅为 WebClient 提供令牌注入支持(通过 ServerOAuth2AuthorizedClientExchangeFilterFunction),而不是 RestTemplate(与以前的 OAuth2RestTemplate 一样),并且使用该过滤器需要 ReactiveOAuth2AuthorizedClientManager 或 ReactiveClientRegistrationRepository 和 ServerOAuth2AuthorizedClientRepository
从这个评论来看,据我所知,这是不准确的。 Servlet 环境的 WebClient 集成可以通过 a 进行配置ServletOAuth2AuthorizedClientExchangeFilterFunction
,这需要 aOAuth2AuthorizedClientManager
或ClientRegistrationRepository
和OAuth2AuthorizedClientRepository
。这些是由OAuth2ClientAutoConfiguration
servlet 应用程序自动配置的。此示例展示了如何在 servlet 应用程序中为 WebClient 配置 OAuth2。您能解释一下为什么这个设置不适合您吗?
由于缺乏所需的反馈而关闭。如果您希望我们查看此问题,请提供所需的信息,我们将重新打开该问题。