Приложение Spring boot, которое считывало бы конфигурацию из хранилища ключей и подключалось к SQL?

#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.

  1. Откройте 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/
      

    Полный список доступных свойств задокументирован в
    ссылке на свойство
    .

  2. Сохраните файл и закройте его.

Внесите одно простое изменение в keyvaultприложение.java-файл (или любое другое имя класса в вашем случае).

  1. Откройте src/main/java/com/contoso/keyvault/keyvaultприложение.java в текстовом редакторе.

  2. Добавьте этот импорт.

     import org.springframework.beans.factory.annotation.Value;
      
  3. Добавьте аннотацию к переменной экземпляра ConnectionString.

     @Value("${connectionString}")
    private String connectionString;  
      

    Интеграция с хранилищем ключей предоставляет источник PropertySource , который заполняется на основе
    значений хранилища ключей. Некоторые дополнительные сведения о реализации доступны в
    справочной документации
    .

  4. В каталоге keyvault верхнего уровня, где pom.xml файл найден, введите mvn clean package spring-boot:run .

  5. Завершенная инициализация сообщения в выводе команды означает, что сервер готов. В отдельном окне командной строки введите эту команду.

     Bash
    $ curl http://localhost:8080/get
      

    Вывод будет отображаться
    jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE вместо
    defaultValue .

  6. Завершите процесс, из которого выполняется mvn spring-boot:run . Вы можете ввести Ctrl-C или использовать jps команду, чтобы получить pid Launcher процесса и завершить его.

Надеюсь, это поможет вам разобраться.

Комментарии:

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/