Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом руководстве показано, как использовать Key Vault в приложениях Spring Boot для защиты конфиденциальных данных конфигурации и получения свойств конфигурации из Key Vault. Key Vault обеспечивает безопасное хранение универсальных секретов, таких как пароли и строки подключения к базе данных.
Предварительные условия
- Подписка Azure — создать бесплатно.
- Java Development Kit (JDK) версии 8 или более поздней.
- Apache Maven
- Azure CLI
- Экземпляр Key Vault (хранилище ключей) Если у вас его нет, см. раздел Quickstart: создание хранилища ключей с помощью портала Azure. Кроме того, запишите унифицированный идентификатор ресурса (URI) экземпляра Key Vault, так как он необходим для тестового приложения для этого руководства.
- Приложение Spring Boot. Если у вас его нет, создайте проект Maven, используя Spring Initializr. Обязательно выберите Maven Project и в разделе Dependencies, добавьте Spring Web, Spring Data JPA и H2 Database и выберите Java версии 8 или более поздней.
Внимание
Для выполнения действий, описанных в этой статье, требуется spring Boot версии 2.5 или более поздней.
Установка секрета для Azure Key Vault
В этом руководстве описывается, как считывать учетные данные базы данных из Key Vault в приложении Spring Boot. Чтобы считывать учетные данные из Key Vault, необходимо сначала сохранить учетные данные базы данных в Key Vault.
Сведения о хранении URL-адреса базы данных H2 в качестве нового секрета в Key Vault см. в разделе Quickstart: установка и извлечение секрета из Azure Key Vault с помощью портала Azure. В этом руководстве вы задали секрет с именем h2url и значением jdbc:h2:~/testdb;user=sa;password=password.
Примечание.
После задания секрета предоставьте приложению доступ к Key Vault, следуя инструкциям в Назначение политики доступа Key Vault.
Чтение секрета из Azure Key Vault
Теперь, когда учетные данные базы данных хранятся в Key Vault, их можно получить с помощью Spring Cloud Azure.
Чтобы установить модуль Spring Cloud Azure Key Vault Starter, добавьте следующие зависимости в файл pom.xml:
Список компонентов (BOM) Spring Cloud для Azure
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>7.1.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>Примечание.
Если вы используете Spring Boot 4.0.x, обязательно установите версию, указанную в
spring-cloud-azure-dependencies, на значение7.1.0.Если вы используете Spring Boot 3.5.x, обязательно задайте версию
spring-cloud-azure-dependenciesна6.2.0.Если вы используете Spring Boot 3.1.x-3.5.x, обязательно установите для нее версию
spring-cloud-azure-dependenciesна5.25.0.Если вы используете Spring Boot 2.x, обязательно установите версию
spring-cloud-azure-dependenciesна4.20.0.Эта ведомость материалов (BOM) должна быть сконфигурирована в
<dependencyManagement>разделе файла pom.xml. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию.Дополнительные сведения о версии, используемой для этого BOM, можно найти в разделе Какую версию Spring Cloud Azure мне следует использовать?.
Артефакт Spring Cloud Azure Key Vault Starter:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-keyvault</artifactId> </dependency>
Spring Cloud Azure имеет несколько методов чтения секретов из Key Vault. Для разных вариантов использования можно использовать следующие методы независимо или объединить их.
- Используйте Azure SDK для Key Vault.
- Используйте Spring KeyVault
PropertySource.
Использование Azure SDK для Key Vault
Azure SDK для Key Vault предоставляет SecretClient для управления секретами в Key Vault.
В следующем примере кода показано, как использовать SecretClient для получения учетных данных базы данных H2 из Azure Key Vault.
Чтобы прочитать секрет с помощью Azure SDK из Key Vault, настройте приложение, выполнив следующие действия.
Настройте конечную точку Key Vault в файле конфигурации application.properties.
spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/Внедрите
SecretClientbean в ваше Spring-приложение и используйте методgetSecretдля извлечения секрета, как показано в следующем примере:import com.azure.security.keyvault.secrets.SecretClient; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SecretClientApplication implements CommandLineRunner { // Spring Cloud Azure will automatically inject SecretClient in your ApplicationContext. private final SecretClient secretClient; public SecretClientApplication(SecretClient secretClient) { this.secretClient = secretClient; } public static void main(String[] args) { SpringApplication.run(SecretClientApplication.class, args); } @Override public void run(String... args) { System.out.println("h2url: " + secretClient.getSecret("h2url").getValue()); } }Совет
В этом руководстве нет операций проверки подлинности в конфигурациях или коде. Однако для подключения к службам Azure требуется проверка подлинности. Чтобы завершить проверку подлинности, необходимо использовать удостоверение Azure. Spring Cloud Azure использует
DefaultAzureCredential, который предоставляет библиотека идентификации Azure, чтобы помочь вам получить учетные данные без каких-либо изменений кода.DefaultAzureCredentialподдерживает несколько методов проверки подлинности и определяет, какой метод следует использовать во время выполнения. Этот подход позволяет приложению использовать различные методы проверки подлинности в разных средах (например, локальных и рабочих средах), не реализуя код, зависящий от среды. Дополнительные сведения см. в разделе DefaultAzureCredential.Для выполнения проверки подлинности в локальных средах разработки можно использовать Azure CLI, Visual Studio Code, PowerShell или другие методы. Дополнительные сведения см. в разделе Аутентификация Azure в средах разработки на Java. Чтобы завершить проверку подлинности в средах размещения Azure, рекомендуется использовать управляемое удостоверение, назначаемое пользователем. Дополнительные сведения см. в разделе Управляемые удостоверения для ресурсов Azure.
Запустите приложение. Вы увидите журналы, аналогичные следующему примеру:
h2url: jdbc:h2:~/testdb;user=sa;password=password
Вы можете создать SecretClient фасоль самостоятельно, но процесс сложный. В приложениях Spring Boot необходимо управлять свойствами, изучать шаблон построителя и регистрировать клиент в контексте приложения Spring. В следующем примере кода показано, как создать SecretClient bean:
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SecretClientConfiguration {
@Bean
public SecretClient createSecretClient() {
return new SecretClientBuilder()
.vaultUrl("https://<your-key-vault-url>.vault.azure.net/")
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
}
}
В следующем списке показаны некоторые причины, по которым этот код не является гибким или грациозным:
- Конечная точка Key Vault жестко закодирована.
- Если вы используете
@Valueдля получения конфигураций из среды Spring, в файле application.properties невозможно указать IDE. - Если у вас есть сценарий микросервисов, код приходится дублировать в каждом проекте, и легко ошибиться, а поддерживать согласованность сложно.
К счастью, вам не нужно самостоятельно собирать SecretClient бина с Spring Cloud Azure. Вместо этого можно напрямую внедрить SecretClient и использовать свойства конфигурации, с которыми вы уже знакомы для настройки Key Vault. Для получения дополнительной информации см. Примеры конфигурации.
Spring Cloud Azure также предоставляет следующие глобальные конфигурации для различных сценариев. Для получения дополнительной информации см. раздел Глобальная конфигурация пакетов SDK для служб Azure в руководстве разработчика Spring Cloud для Azure.
- Параметры прокси-сервера.
- Параметры повторных попыток.
- Параметры клиента транспорта HTTP.
Вы также можете подключиться к разным Azure облакам. Дополнительные сведения см. в разделе Подключение к различным облакам Azure.
Использование Spring Key Vault PropertySource
В предыдущих разделах показано, как использовать SecretClient в CommandLineRunner, чтобы считать секрет после запуска приложения. Однако в приложениях Spring Boot требуется чтение секретов перед запуском приложения. Например, перед запуском приложения требуется свойство пароля источника данных. Предыдущий сценарий не будет работать, если вы хотите сохранить пароль источника данных в Key Vault и по-прежнему использовать автоматическую конфигурацию Spring для получения источника данных.
В этом случае Spring Cloud Azure обеспечивает интеграцию среды Spring для загрузки секретов из Key Vault перед созданием контекста приложения. Секрет можно использовать для создания и настройки bean во время инициализации контекста приложения Spring. Этот подход является прозрачным способом доступа к секретам из Key Vault, и изменения кода не требуются.
В следующем примере кода показано, как использовать PropertySource для получения учетных данных базы данных H2 для создания источника данных из Azure Key Vault.
Чтобы получить URL-адрес базы данных H2 из Key Vault и сохранить данные из базы данных H2 с помощью Spring Data JPA, настройте приложение, выполнив следующие действия.
Добавьте следующие свойства конечной точки и источника данных Key Vault в файл конфигурации application.properties.
logging.level.org.hibernate.SQL=DEBUG spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=https://<your-keyvault-name>.vault.azure.net/ spring.datasource.url=${h2url} spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.database-platform=org.hibernate.dialect.H2DialectСовет
См. примеры конфигурации свойств Spring Cloud Azure в разделе Configuration examples руководства для разработчиков Spring Cloud Azure.
Этот пример — это простой сценарий базы данных с помощью базы данных H2. Мы рекомендуем использовать Azure Database for MySQL или Azure Database for PostgreSQL в рабочей среде и хранить URL-адрес базы данных, имя пользователя и пароль в Azure Key Vault. Если вы хотите избежать пароля, подключение без пароля является хорошим выбором. Дополнительные сведения см. в разделе Passwordless connections for Azure services.
Создайте новый класс
TodoJava. Этот класс представляет собой модель домена, сопоставленную с таблицейtodo, которая будет автоматически создана JPA. Следующий код игнорируетgettersметоды иsettersметоды.import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; @Entity public class Todo { public Todo() { } public Todo(String description, String details, boolean done) { this.description = description; this.details = details; this.done = done; } @Id @GeneratedValue private Long id; private String description; private String details; private boolean done; }Измените файл класса запуска, чтобы отобразить следующее содержимое.
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.data.jpa.repository.JpaRepository; import java.util.stream.Stream; @SpringBootApplication public class KeyvaultApplication { public static void main(String[] args) { SpringApplication.run(KeyvaultApplication.class, args); } @Bean ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) { return event->repository .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up " + "correctly!", true)).toList()) .forEach(System.out::println); } } interface TodoRepository extends JpaRepository<Todo, Long> { }Запустите приложение. Приложение получит URL-адрес базы данных H2 из Key Vault, а затем подключитесь к базе данных H2 и сохраните данные в базе данных. Вы увидите журналы, аналогичные следующему примеру:
2023-01-13 15:51:35.498 DEBUG 5616 --- [main] org.hibernate.SQL: insert into todo (description, details, done, id) values (?, ?, ?, ?) com.contoso.keyvault.Todo@1f
Развертывание в Azure Spring Apps
Теперь, когда у вас есть приложение Spring Boot, работающее локально, пришло время переместить его в рабочую среду. Azure Spring Apps упрощает развертывание приложений Spring Boot для Azure без каких-либо изменений кода. Эта служба управляет инфраструктурой приложений Spring, благодаря чему разработчики могут сосредоточиться на коде. Azure Spring Apps обеспечивает управление жизненным циклом с помощью комплексного мониторинга и диагностики, управления конфигурацией, обнаружения служб, интеграции CI/CD, развертывания по схеме blue-green и многого другого. Чтобы развернуть ваше приложение в Azure Spring Apps, см. статью Развертывание первого приложения в Azure Spring Apps.