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

Fra*_*ank 5 configuration azure spring-boot azure-keyvault

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

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
        <version>2.1.6</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

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

@Value("${ServerPassphrase}")
String serverPassphrase;
Run Code Online (Sandbox Code Playgroud)

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

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

Fra*_*ank 2

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

数据源代码(我使用点符号从应用程序属性中读取所有常见属性,仅从 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();
}
Run Code Online (Sandbox Code Playgroud)

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

@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;
}
Run Code Online (Sandbox Code Playgroud)

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