Использование Azure KeyVault для пароля базы данных в приложении Spring Boot - PullRequest
0 голосов
/ 08 октября 2019

Я работаю над приложением Spring Boot, которое нужно развернуть в Azure. Используя следующую зависимость, мне удалось использовать секреты из KeyVault для чувствительных свойств приложения:

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

С установкой poperty azure.keyvault.uri=https://my-vault.vault.azure.net и настройкой идентификатора управляемой службы я просто вставляю секретное имя из KeyVault следующим образом:

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

Теперь у меня есть соединение с базой данных и пароль имеет обычный ключ spring.datasource.password. К сожалению, точки в секретных именах в Azure KeyVault не допускаются. : - (

Есть ли простой способ заменить точки на дефисы, которые являются допустимыми символами в KeyVault, или мне нужно написать собственный преобразователь свойств в качестве оболочки?

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Так что, в конце концов, кажется, нет простого способа сказать весенней загрузке использовать тире вместо точек. В конце концов я написал свой DataSource в своем MainConfig, а также ServletWebServerFactory, чтобы установить все свойства ssl для tomcat. На случай, если кто-то здесь окажется в поиске решения этой или подобной проблемы, я опубликую некоторые фрагменты кода, которые могут помочь.

Код для источника данных (все общие свойства я читаю из свойств приложения, используяточка-нотация, просто имя пользователя и пароль считываются из 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 -аннотации):

@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;
}

Там, где были другие места, где мне приходилось использовать что-то подобное, но так как это было специально для нашего решения, я не буду публиковать это здесь. Я думаю, что вы можете получить представление о том, как решить такие вещи из размещенного кода.

0 голосов
/ 09 октября 2019

Секретные имена могут содержать только буквенно-цифровые символы и тире.

Секретное имя - это только имя, нам нужно его значение. Я использую тире вместо точек.

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

enter image description here

Обновление:

IИнтересно, есть ли простой способ сказать Spring, чтобы использовать тире вместо точек, чтобы не было необходимости писать дополнительный код.

Насколько я знаю, такого способа не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...