在 Spring 启动应用程序中使用 Azure KeyVault 作为数据库密码

Using Azure KeyVault for database password in Spring Boot application

我正在开发一个 Spring 应该部署到 Azure 的启动应用程序。 使用以下依赖项,我设法将 KeyVault 中的秘密用于敏感的应用程序属性:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
        <version>2.1.6</version>
    </dependency>

通过设置属性 azure.keyvault.uri=https://my-vault.vault.azure.net 和配置托管服务身份,我只是从 KeyVault 中注入秘密名称,如下所示:

@Value("${ServerPassphrase}")
String serverPassphrase;

现在我有一个数据库连接,密码有常用的密钥 spring.datasource.password。不幸的是,Azure KeyVault 的秘密名称中不允许使用点。 :-(

是否有一种简单的方法可以将点替换为 KeyVault 中允许的字符的破折号,或者我是否必须编写自定义 属性 解析器作为包装器?

Secret names can only contain alphanumeric characters and dashes.

Secret name只是一个名字,我们需要的是它的值。我使用破折号而不是点。

@Value("${spring-datasource-password}")
private String dataSourcePassword;

更新:

I wondered if there is a simple way to tell spring to use dashes instead of dots so it won't be necessary to write extra code.

据我所知,没有这样的方法。

所以毕竟,似乎没有简单的方法告诉 spring 引导使用破折号而不是点。 我最终在我的 MainConfig 中编写了自定义 DataSource 以及自定义 ServletWebServerFactory 来设置 tomcat 的所有 ssl 属性。 如果有人最终来到这里,寻找此问题或类似问题的解决方案,我将 post 一些可能有帮助的代码片段。

DataSource 的代码(我使用点符号从应用程序属性中读取所有公共属性,仅从 KeyVault 中读取用户名和密码):

@Value("${db-user}")
String dbUser;

@Value("${db-password}")
String dbPwd;

@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource getDataSource() {
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
    dataSourceBuilder.username(dbUser);
    dataSourceBuilder.password(dbPwd);
    return dataSourceBuilder.build();
}

ServletWebServerFactory 的代码(使用 @Value-annotation 如上所述注入所有使用的值):

@Bean
public ServletWebServerFactory servletContainer() {

    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    TomcatConnectorCustomizer tomcatConnectorCustomizer = connector -> {
        connector.setPort(port);
        connector.setScheme("https");
        connector.setSecure(true);

        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
        protocol.setSSLEnabled(true);
        protocol.setKeystoreType(keyStoreType);
        protocol.setKeystoreProvider(keyStoreProvider);
        protocol.setKeystoreFile(keyStorePath);
        protocol.setKeystorePass(keyStorePassword);
        protocol.setKeyAlias(keyAlias);
        protocol.setTruststoreFile(trustStorePath);
        protocol.setTruststorePass(trustStorePassword);
        protocol.setSSLVerifyClient(clientAuth);
    };

    tomcat.addConnectorCustomizers(tomcatConnectorCustomizer);
    return tomcat;
}

在其他一些地方我不得不使用类似的东西,但由于这是专门用于我们的解决方案,所以我不会在这里 post。我认为您可能会从 posted 代码中了解到如何解决此类问题。

this tutorial 中,他们不需要属性文件的技巧,使用 '-' 作为 '.'对于密钥库,API 似乎自动将“-”替换为“.”。 测试并使用 azure-keyvault-secrets-spring-boot-starter

版本 2.3.2

在"Azure Key Vault Secrets Spring boot starter"的官方文档中 有一节关于 this problem 您必须在属性文件中使用不兼容的属性。 但它对我不起作用

spring.datasource.password=${spring-datasource-password}