java 在使用spring.config.import时如何访问OAuth2安全的Spring云配置服务器?

ih99xse1  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(131)

我有一个Spring Cloud配置服务器,它使用OAuth2进行保护,并使用旧式(Spring 2.4之前)bootstrap方法绑定到config服务器。为了使它使用OAuth2 RestTemplate,我实现了一个自定义的ConfigServicePropertySourceLocator,它设置了rest模板,通过spring.factories进行配置(我发现了一些示例,展示了如何做到这一点):

@Configuration
public class ConfigClientOAuth2BootstrapConfiguration {

    @Bean
    @Primary
    public ConfigServicePropertySourceLocator configServicePropertySourceLocator() {
        ConfigClientProperties clientProperties = configClientProperties();
        ConfigServicePropertySourceLocator locator = new ConfigServicePropertySourceLocator(clientProperties);
        locator.setRestTemplate(oauth2RestTemplate());
        
        return locator;
    }

    [...]
}

META-INF/Spring工厂:

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.example.config.ConfigClientOAuth2BootstrapConfiguration

这样一切都很好。
但是我想使用新的Sping Boot Config Data方法通过spring.config.import=optional:configserver:导入,而不是在2.4中引入的(取消了bootstrap.properties,以及对spring-cloud-starter-bootstrap的需求),但是找不到任何关于如何在这种情况下设置自定义Rest Template的文档或示例。
有没有人有一个例子(或链接到文档),如何可以做到这一点?或者也许这是不可能的?

igetnqfo

igetnqfo1#

实际上,您可以通过创建一个自定义的ConfigDataLoader来实现这一点,该ConfigDataLoaderConfigServicePropertySourceLocator上设置RestTemplate。

public class OAuth2ConfigDataLoader implements ConfigDataLoader<ConfigServerConfigData> {

    private final ConfigClientProperties clientProperties;
    private final OAuth2RestTemplate oauth2RestTemplate;

    public OAuth2ConfigDataLoader(ConfigClientProperties clientProperties,
                                  OAuth2RestTemplate oauth2RestTemplate) {
        this.clientProperties = clientProperties;
        this.oauth2RestTemplate = oauth2RestTemplate;
    }

    @Override
    public ConfigServerConfigData load(ConfigDataLoaderContext context,
                                       ConfigServerConfigDataResource resource)
            throws ConfigDataNotFoundException, IOException {
        ConfigServicePropertySourceLocator locator =
                new ConfigServicePropertySourceLocator(clientProperties);
        locator.setRestTemplate(oauth2RestTemplate);
        return new ConfigServerConfigData(locator);
    }

    @Override
    public ConfigDataLoader<ConfigServerConfigData> withFallback(ConfigDataLoader<?> fallback) {
        return this;
    }
}

然后创建一个配置类来配置OAuth2RestTemplate

@Configuration
public class OAuth2RestTemplateConfig {

    @Bean
    public OAuth2RestTemplate oauth2RestTemplate() {
        // configure and return the OAuth2RestTemplate
    }
}

最后一步,在application.properties文件中设置这些参数:

spring.config.import=optional:configserver:http://localhost:8888/
spring.config.imports[0].name=oauth2
spring.config.imports[0].optional=true
spring.config.imports[0].loader=com.example.config.OAuth2ConfigDataLoader

相关问题