#spring #azure #spring-boot #azure-sql-database #azure-keyvault
#spring #azure #spring-boot #azure-sql-database #azure-keyvault
Вопрос:
Я не разработчик Java / Spring Boot, однако я хочу создать простое приложение Spring boot, которое считывало бы конфигурацию из хранилища ключей и подключалось к SQL.
У меня есть два отдельных решения для каждого из них
Решение хранилища ключей заключается в чтении секретов из хранилища ключей Azure
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Value;
@SpringBootApplication
@RestController
public class KeyvaultApplication {
public static void main(String[] args) {
SpringApplication.run(KeyvaultApplication.class, args);
}
@GetMapping("get")
public String get() {
return connectionString;
}
@Value("${connectionString}")
private String connectionString;
public void run(String... varl) throws Exception {
System.out.println(String.format("nConnection String stored in Azure Key Vault:n%sn",connectionString));
}
}
application.properties
azure.keyvault.client-id=xxxx
azure.keyvault.client-key=xxxx
azure.keyvault.enabled=true
azure.keyvault.tenant-id=xxxxx
azure.keyvault.uri=https://xxxxx-keyvault85.vault.azure.net/
======================================================================
и решение SQL для вставки данных в базу данных SQL Azure
application.properties
logging.level.org.springframework.jdbc.core=DEBUG
spring.datasource.url=jdbc:sqlserver://xxxx-sql.database.windows.net:1433;database=demo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
spring.datasource.username=spring@databasename
spring.datasource.password=Password
spring.datasource.initialization-mode=never
TodoController.java
package com.example.demo;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/")
public class TodoController {
private final TodoRepository todoRepository;
public TodoController(TodoRepository todoRepository) {
this.todoRepository = todoRepository;
}
@PostMapping("/")
@ResponseStatus(HttpStatus.CREATED)
public Todo createTodo(@RequestBody Todo todo) {
return todoRepository.save(todo);
}
@GetMapping("/")
public Iterable<Todo> getTodos() {
return todoRepository.findAll();
}
}
TodoRepository.java
package com.example.demo;
import org.springframework.data.repository.CrudRepository;
public interface TodoRepository extends CrudRepository<Todo, Long> {
}
Todo.java
package com.example.demo;
import org.springframework.data.annotation.Id;
public class Todo {
public Todo() {
}
public Todo(String description, String details, boolean done) {
this.description = description;
this.details = details;
this.done = done;
}
@Id
private Long id;
private String description;
private String details;
private boolean done;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
public boolean isDone() {
return done;
}
public void setDone(boolean done) {
this.done = done;
}
}
Оба решения работают независимо, однако я хочу объединить решения, чтобы я мог считывать конфигурацию SQL из хранилища ключей Azure и подключаться к базе данных SQL Azure. Как мне этого добиться?
Ответ №1:
Можете ли вы сослаться на этот документ: Учебное пособие: чтение секрета из хранилища ключей Azure в приложении Spring Boot:
Приложения Spring Boot выводят наружу конфиденциальную информацию, такую как имена пользователей и пароли. Вывод конфиденциальной информации обеспечивает лучшую удобство обслуживания, возможность тестирования и безопасность. Хранить секреты вне кода лучше, чем жестко кодировать информацию или вставлять ее во время сборки.
В этом руководстве описывается, как создать загрузочное приложение Spring, которое считывает значение из хранилища ключей Azure, а затем развернуть приложение в службе приложений Azure и облаке Azure Spring.
Краткое описание добавления интеграции хранилища ключей в приложение:
Выполните следующие действия, чтобы добавить необходимую конфигурацию в файл application.properties.
-
Откройте src/main/resources/application.properties в редакторе и создайте в нем следующее содержимое, изменив значения для вашей подписки Azure.
azure.keyvault.client-id=685on005-ns8q-4o04-8s16-n7os38o2ro5n azure.keyvault.client-key=4bt.lCKJKlbYLn_3XF~wWtUwyHU0jKggu2 azure.keyvault.enabled=true azure.keyvault.tenant-id=72s988os-86s1-41ns-91no-2q7pq011qo47 azure.keyvault.uri=https://contosokv.vault.azure.net/
Полный список доступных свойств задокументирован в
ссылке на свойство. -
Сохраните файл и закройте его.
Внесите одно простое изменение в keyvaultприложение.java-файл (или любое другое имя класса в вашем случае).
-
Откройте src/main/java/com/contoso/keyvault/keyvaultприложение.java в текстовом редакторе.
-
Добавьте этот импорт.
import org.springframework.beans.factory.annotation.Value;
-
Добавьте аннотацию к переменной экземпляра ConnectionString.
@Value("${connectionString}") private String connectionString;
Интеграция с хранилищем ключей предоставляет источник
PropertySource
, который заполняется на основе
значений хранилища ключей. Некоторые дополнительные сведения о реализации доступны в
справочной документации. -
В каталоге keyvault верхнего уровня, где pom.xml файл найден, введите
mvn clean package spring-boot:run
. -
Завершенная инициализация сообщения в выводе команды означает, что сервер готов. В отдельном окне командной строки введите эту команду.
Bash $ curl http://localhost:8080/get
Вывод будет отображаться
jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE
вместо
defaultValue
. -
Завершите процесс, из которого выполняется
mvn spring-boot:run
. Вы можете ввести Ctrl-C или использоватьjps
команду, чтобы получить pidLauncher
процесса и завершить его.
Надеюсь, это поможет вам разобраться.
Комментарии:
1. Я мог бы прочитать секрет из хранилища ключей Azure, однако я хочу установить следующие свойства приложения для подключения к журналу базы данных Azure Sql. level.org.springframework.jdbc.core = ОТЛАДКА spring.datasource.url=jdbc:sqlserver://xxxx-sql.database.windows.net:1433;database=demo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30 ; spring.datasource.username=spring@databasename весна.источник данных.пароль=пароль spring.datasource.initialization-mode = никогда
2. Есть ли какой-либо другой способ сделать это, не раскрывая azure.keyvault.client-key в application.properties?
Ответ №2:
Вы можете определить свои свойства с помощью ‘-‘ вместо ‘.’
Например: spring.datasource.username=spring@databasename
В Azure cli:
az keyvault secret set --name "spring-datasource-username" --vault-name "your-key-vault" --value "spring@databasename"
ИЛИ на портале Azure:
ваше хранилище ключей должно быть таким
name:
spring-datasource-username
value:
spring@databasename
Комментарии:
1. Вы спасли мой день! Spring распознает
spring.data.password
как то жеspring-data-password
самое, что и .
Ответ №3:
Из того, что я пробовал с этой версией
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
<version>2.1.7</version>
</dependency>
требуется только 3 параметра.
Файл YAML
azure:
keyvault:
client-id: xxxxxxx
client-key: xxxxxxyyyyy
enabled: true
uri: https://xxx.vault.azure.net/
Затем класс конфигурации
@Configuration
public class AzureConfig {
@Value("${azure.keyvault.client-id}")
private String clientId;
@Value("${azure.keyvault.client-key}")
private String clientSecret;
@Bean
public KeyVaultClient keyVaultClient() {
ServiceClientCredentials credentials = new AzureKeyVaultCredential(clientId, clientSecret);
return new KeyVaultClient(credentials);
}
}
Затем в классе обслуживания keyVaultClient
для автоматического подключения, чтобы установить или получить
SetSecretRequest secretRequest = new Builder(keyVaultUrl, key, value).build();
keyVaultClient.setSecret(secretRequest);
keyVaultUrl
URL-адрес узла хранилища ключей похож https://xxx.vault.azure.net/