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

在Spring Boot应用程序中使用Azure KeyVault作为数据库密码,azure,spring-boot,configuration,azure-keyvault,Azure,Spring Boot,Configuration,Azure Keyvault,我正在开发一个应该部署到Azure的Spring启动应用程序。 使用以下依赖关系,我成功地将KeyVault中的机密用于敏感应用程序属性: <dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId> &l

我正在开发一个应该部署到Azure的Spring启动应用程序。 使用以下依赖关系,我成功地将KeyVault中的机密用于敏感应用程序属性:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
        <version>2.1.6</version>
    </dependency>
现在我有了一个数据库连接,密码是常用的键
spring.datasource.password
。不幸的是,Azure KeyVault中的秘密名称中不允许使用点:-(

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

机密名称只能包含字母数字字符和破折号

秘密名称只是一个名称,我们需要的是它的值。我使用的是破折号而不是点

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

更新:

我想知道是否有一种简单的方法告诉spring使用破折号 而不是点,这样就不需要编写额外的代码


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

所以毕竟,似乎没有简单的方法告诉spring boot使用破折号而不是点。 最后,我在MainConfig中编写了一个自定义的
数据源
,以及一个自定义的
ServletWebServerFactory
,以设置tomcat的所有ssl属性。 对于有人最终出现在这里的情况,我将发布一些可能有帮助的代码片段,以寻找解决此问题或类似问题的方法

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

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

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

在中,他们不需要使用属性文件的技巧,对keyvault使用“-”as“。而且API似乎可以自动执行将“-”替换为“.”。 测试并使用azure keyvault secrets spring boot starter的2.3.2版


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

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

我已经试过了,但spring boot的默认数据源配置似乎无法读取此属性。当然,我可以使用自定义数据源,但我希望避免这种情况。此外,这不是我想要存储机密的唯一属性,spring约定使用dots(例如:server.ssl.key password),我想知道是否有一种简单的方法可以告诉spring使用破折号而不是点,这样就不必编写额外的代码。@Frank,据我所知,spring中没有这种方法。哦,对不起,完全忘记了这一点。我最后做了我想做的事情:编写一个自定义数据源和一个自定义TomcatInitializer以ke使用带破折号的属性。@Frank既然您的问题已经解决,您能接受它作为答案还是添加更好的答案?那么这个问题就可以解决了。谢谢。
@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();
}
@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;
}
spring.datasource.password=${spring-datasource-password}