当前位置: 首页 > 知识库问答 >
问题:

无法将@LoadBalanced与在ClientCredentials上配置的OAuth2RestTemplate一起使用

鲜于光赫
2023-03-14

我想使用OAuth2客户端凭据流在两个资源服务器之间进行服务间通信。一切正常,只是我无法在对远程资源服务器的OAuth2RestTemplate调用中使用服务名称(功能区负载均衡器功能)而不是主机名。

我的一个资源服务器(调用另一个资源服务器)具有以下配置:

Spring Boot 1.5.13
Spring Cloud Edgware.SR3

build.gradle 包含尤里卡和功能区的条目

compile('org.springframework.cloud:spring-cloud-starter-ribbon')
compile('org.springframework.cloud:spring-cloud-starter-eureka')


@Configuration
class RestTemplateConfig {

    @Bean
    @ConfigurationProperties("security.oauth2.client")
    public ClientCredentialsResourceDetails oauth2ClientCredentialsResourceDetails() {
        return new ClientCredentialsResourceDetails();
    }

    @LoadBalanced
    @Bean(name = "oauthRestTemplate")
    public OAuth2RestOperations oAuthRestTemplate(ClientCredentialsResourceDetails oauth2ClientCredentialsResourceDetails) {
        return new OAuth2RestTemplate(oauth2ClientCredentialsResourceDetails);
    }
}

使用此OAuth2RestTemplate的服务

@Service
class TestService {

    @Autowired
    @Qualifier("oauthRestTemplate")
    private OAuth2RestOperations oAuth2RestOperations;

    public void notifyOrderStatus(long orderId, OrderStatus newStatus) {
        oAuth2RestOperations.exchange("http://notification-service/api/order/{id}/status/{status}", HttpMethod.POST, null, Void.class, orderId, newStatus.name());
    }
}

使用服务名(即< code > http://notification-service )而不是远程资源服务器的实际主机名和端口调用远程服务时出现异常。如果我使用实际的主机名端口,那么一切正常,但是我不希望我的一个资源知道另一个资源服务器的主机/post。

例外:

Caused by: java.net.UnknownHostException: notification-service 

我有几个问题:

  1. 如果我的RestTemplate用@LoadBalanced注释,则一切正常。OAuth2RestTemplate是否支持此注释,我们可以使用服务名称代替主机名吗?如果是,请提供任何参考或文件
  2. 使用oauth2客户端凭据在两个资源服务器之间实现服务间安全是一个好主意吗?我在文档中没有看到任何相同的示例

共有1个答案

邵正雅
2023-03-14

@LoadBalanced当我们使用 RestTemplate自定义器自定义新创建的 OAuth2Rest 模板时,RestTemplate 可以正常工作,如下面的代码所示:

@Bean(name = "MyOAuthRestTemplate")
@LoadBalanced
public OAuth2RestOperations restTemplate(RestTemplateCustomizer customizer, ClientCredentialsResourceDetails oauth2ClientCredentialsResourceDetails) {
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(oauth2ClientCredentialsResourceDetails);
    customizer.customize(restTemplate);
    return restTemplate;
}

使用此RestTemplate时,使用服务名而不是实际主机名可以很好地工作。

 类似资料:
  • 问题内容: 我无法让spring-data-elasticsearch适用于Elasticsearch 2.0+版本。 关于使用以下POM 并添加自定义的ElasticsearchConfiguration 在 Application.java* 下面 * 在有效的POM中,我仍然收到elasticsearch 1.5.2(以及附加的2.0.1.RELEASE版本)作为依赖项。 在运行应用程序时收

  • 我目前正在将IntelliJ IDE用于复杂的GWT项目。我想在GWT的开发模式中利用JRebel,所以最近我为IntelliJ安装了JRebel插件,但在使其工作时遇到了麻烦。 基本上IntelliJ不具备在更改时自动编译应用程序的能力,所以每当您对代码进行更改时,我都必须进行编译- 信息:使用JavaC1.7.0_21编译java源代码信息:15个错误信息:0个警告信息:编译完成,9分钟5秒内

  • 问题内容: 当我插入和拔出电源时,系统看到有东西插入: AVRISP MKII应该依靠cdc-acm: 因此它应该能够很好地看到它,但是我无法写它。 退货 问题答案: 事实证明,Ubuntu会承认对象存在,但在修复某些udev规则之前,它并不能很好地发挥作用。多亏了http://steve.kargs.net/bacnet/avr- isp-mkii-on-ubuntu-hardy/ ,该文件提供

  • 我最近安装了Xcode8测试版5。在我的MAC 10.11.6上的Appium 1.6.0测试版现在,在阅读了所有的论坛并使Appium启动并启动我的应用程序后,我无法找到如何用这个Appium 1.6.0测试版启动我的inspector和在我的应用程序中找到元素。如何使用appium 1.6.0测试版启动inspector?如果不能,我们如何找到xpath或找到元素??

  • IntelliJ IDEA 2018.2.3(终极版) 楼#IU-182.4323.46,建于2018年9月3日 jre:1.8.0_152-release-1248-b8 amd64 JVM:OpenJDK 64位服务器VM by JetBrains s.r.o Windows 10 10.0 插件:VisualVM启动器(1.10.138.2210) 当我单击Run选项卡中的launcher图

  • 我们将Java版本从8升级到11,但我在使用Lombok的Getter和Setter注释实现POJO类时遇到了Getter/Setter方法的编译错误。 有没有一种方法可以使用Lombok的注释,该注释提供getter和setter而不在Java11中实现它们? 找不到getStoreName() 其中被声明为类中的全局变量,并在类上方使用@data Lombok注释。