Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym samouczku pokazano, jak używać usługi Key Vault w aplikacjach Spring Boot do zabezpieczania poufnych danych konfiguracji i pobierania właściwości konfiguracji z usługi Key Vault. Usługa Key Vault zapewnia bezpieczny magazyn ogólnych wpisów tajnych, takich jak hasła i parametry połączenia bazy danych.
Wymagania wstępne
- Subskrypcja platformy Azure — utwórz bezpłatnie.
- Zestaw Java Development Kit (JDK) w wersji 8 lub nowszej.
- Apache Maven
- Azure CLI
- Instancja usługi Key Vault. Jeśli go nie masz, zobacz Szybki start: tworzenie magazynu kluczy przy użyciu portalu Azure. Ponadto zanotuj identyfikator URI wystąpienia usługi Key Vault, ponieważ jest on potrzebny w aplikacji testowej na potrzeby tego samouczka.
- Aplikacja Spring Boot. Jeśli go nie masz, utwórz projekt Maven za pomocą narzędzia Spring Initializr. Pamiętaj, aby wybrać Projekt Maven i w obszarze Zależności dodać Spring Web, Spring Data JPA oraz H2 Database, a następnie wybrać wersję Java 8 lub nowszą.
Ważne
Do wykonania kroków opisanych w tym artykule jest wymagany program Spring Boot w wersji 2.5 lub nowszej.
Umieść tajemnicę w Azure Key Vault
W tym samouczku opisano sposób odczytywania poświadczeń bazy danych z usługi Key Vault w aplikacji Spring Boot. Aby odczytać poświadczenia z usługi Key Vault, najpierw należy przechowywać poświadczenia bazy danych w usłudze Key Vault.
Aby przechowywać adres URL bazy danych H2 jako nowy wpis tajny w usłudze Key Vault, zobacz Szybki start: ustawianie i pobieranie wpisu tajnego z usługi Azure Key Vault przy użyciu witryny Azure Portal. W tym samouczku ustawisz tajne ustawienie z nazwą h2url
i wartością jdbc:h2:~/testdb;user=sa;password=password
.
Uwaga
Po ustawieniu sekretu, przyznaj aplikacji dostęp do usługi Key Vault, postępując zgodnie z instrukcjami w temacie Przypisywanie zasad dostępu usługi Key Vault.
Odczytaj tajemnicę z usługi Azure Key Vault
Teraz, gdy poświadczenia bazy danych zostały zapisane w usłudze Key Vault, możesz je pobrać za pomocą platformy Azure Spring Cloud.
Aby zainstalować moduł Spring Cloud Azure Key Vault Starter, dodaj następujące zależności do pliku pom.xml:
Projekt Spring Cloud Azure Bill of Materials (BOM):
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>5.21.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Uwaga
Jeśli używasz środowiska Spring Boot 2.x, pamiętaj, aby ustawić
spring-cloud-azure-dependencies
wersję na4.19.0
. Ten wykaz materiałowy (BOM) należy skonfigurować w sekcji<dependencyManagement>
pliku pom.xml. Gwarantuje to, że wszystkie zależności Spring Cloud Azure korzystają z tej samej wersji. Aby uzyskać więcej informacji na temat wersji używanej dla tego BOM, zobacz Którą wersję Spring Cloud Azure powinienem używać.Artefakt startowy usługi Spring Cloud Azure Key Vault:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-keyvault</artifactId> </dependency>
Platforma Spring Cloud Azure oferuje kilka metod odczytywania wpisów tajnych z usługi Key Vault. Można użyć następujących metod niezależnie lub połączyć je w różnych przypadkach użycia:
- Użyj zestawu Azure SDK dla usługi Key Vault.
- Użyj programu Spring KeyVault
PropertySource
.
Korzystanie z zestawu Azure SDK dla usługi Key Vault
Zestaw Azure SDK dla Azure Key Vault zapewnia SecretClient
do zarządzania sekretami w Azure Key Vault.
Przykład kodu poniżej pokaże, jak użyć SecretClient
, aby pobrać poświadczenia bazy danych H2 z usługi Azure Key Vault.
Aby odczytać wpis tajny przy użyciu zestawu Azure SDK z usługi Key Vault, skonfiguruj aplikację, wykonując następujące kroki:
Skonfiguruj punkt końcowy usługi Key Vault w pliku konfiguracji application.properties .
spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
Wstrzyknij bean
SecretClient
w swojej aplikacji Spring i użyj metodygetSecret
do pobrania sekretu, jak to pokazano w poniższym przykładzie: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()); } }
Napiwek
W tym samouczku nie ma żadnych operacji uwierzytelniania w konfiguracji ani kodzie. Jednak nawiązywanie połączenia z usługami platformy Azure wymaga uwierzytelniania. Aby ukończyć uwierzytelnianie, musisz użyć usługi Azure Identity. Platforma Spring Cloud na platformie Azure używa
DefaultAzureCredential
biblioteki tożsamości platformy Azure, która ułatwia uzyskiwanie poświadczeń bez żadnych zmian w kodzie.DefaultAzureCredential
obsługuje wiele metod uwierzytelniania i określa, która metoda ma być używana w czasie wykonywania. Takie podejście umożliwia aplikacji używanie różnych metod uwierzytelniania w różnych środowiskach (takich jak środowiska lokalne i produkcyjne) bez implementowania kodu specyficznego dla środowiska. Aby uzyskać więcej informacji, zobacz DefaultAzureCredential.Aby ukończyć uwierzytelnianie w lokalnych środowiskach deweloperskich, możesz użyć interfejsu wiersza polecenia platformy Azure, programu Visual Studio Code, programu PowerShell lub innych metod. Aby uzyskać więcej informacji, zobacz Uwierzytelnianie platformy Azure w środowiskach deweloperskich Java. Aby ukończyć uwierzytelnianie w środowiskach hostingu platformy Azure, zalecamy użycie tożsamości zarządzanej przypisanej przez użytkownika. Aby uzyskać więcej informacji, zobacz Co to są tożsamości zarządzane dla zasobów platformy Azure?
Uruchom aplikację. Zobaczysz dzienniki podobne do następującego przykładu:
h2url: jdbc:h2:~/testdb;user=sa;password=password
Możesz samodzielnie zbudować obiekt bean SecretClient
, ale proces jest skomplikowany. W aplikacjach Spring Boot musisz zarządzać właściwościami, uczyć się wzorca konstruktora i rejestrować klienta w kontekście aplikacji Spring. W poniższym przykładzie kodu pokazano, jak utworzyć bean SecretClient
:
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();
}
}
Na poniższej liście przedstawiono niektóre przyczyny, dlaczego ten kod nie jest elastyczny ani elegancki.
- Punkt końcowy usługi Key Vault jest zakodowany w kodzie twardym.
- Jeśli używasz
@Value
do pobierania konfiguracji ze środowiska Spring, nie możesz mieć wskazówek IDE w pliku application.properties. - Jeśli masz scenariusz mikrousług, kod musi być powielony w każdym projekcie, co powoduje, że łatwo popełnić błędy i trudno zachować spójność.
Na szczęście samodzielne tworzenie beana SecretClient
nie jest konieczne w przypadku Spring Cloud Azure. Zamiast tego możesz bezpośrednio wstrzyknąć SecretClient
i użyć właściwości konfiguracji, które już znasz, aby skonfigurować usługę Key Vault. Aby uzyskać więcej informacji, zobacz Przykłady konfiguracji.
Platforma Spring Cloud Azure udostępnia również następujące konfiguracje globalne dla różnych scenariuszy. Aby uzyskać więcej informacji, zobacz sekcję Konfiguracja globalna dla zestawów SDK usługi Azure w przewodniku dewelopera Spring Cloud Azure.
- Opcje serwera proxy.
- Opcje ponawiania prób.
- Opcje klienta transportu HTTP.
Możesz również nawiązać połączenie z różnymi chmurami platformy Azure. Aby uzyskać więcej informacji, zobacz Nawiązywanie połączenia z różnymi chmurami platformy Azure.
Korzystanie z usługi Spring Key Vault PropertySource
W poprzednich sekcjach pokazano, jak używać SecretClient
w kontekście CommandLineRunner
w celu odczytania tajemnicy po uruchomieniu aplikacji. Jednak w aplikacjach Spring Boot odczytywanie wpisów tajnych jest wymagane przed uruchomieniem aplikacji. Na przykład właściwość hasła źródła danych jest wymagana przed uruchomieniem aplikacji. Poprzedni scenariusz nie będzie działać, jeśli chcesz przechowywać hasło źródła danych w usłudze Key Vault i nadal używać automatycznej konfiguracji platformy Spring w celu pobrania źródła danych.
W takim przypadku Spring Cloud Azure zapewnia integrację środowiska Spring w celu załadowania tajemnic z usługi Key Vault, zanim kontekst aplikacji zostanie zbudowany. Możesz użyć sekretu do konstrukcji i konfiguracji beanu podczas inicjalizacji kontekstu aplikacji Spring. Takie podejście jest przejrzystym sposobem uzyskiwania dostępu do sekretów z usługi Key Vault i nie są wymagane żadne zmiany kodu.
W poniższym przykładzie kodu pokazano, jak używać PropertySource
do pobrania poświadczeń bazy danych H2, aby zbudować źródło danych z Azure Key Vault.
Aby pobrać adres URL bazy danych H2 z usługi Key Vault i zapisać dane z bazy danych H2 przy użyciu narzędzia Spring Data JPA, skonfiguruj aplikację, wykonując następujące kroki:
Dodaj następujące właściwości punktu końcowego i źródła danych usługi Key Vault do pliku konfiguracji 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
Napiwek
Przykłady konfiguracji właściwości Spring Cloud Azure można znaleźć w sekcji Przykłady konfiguracjiPrzewodnika dla deweloperów Spring Cloud Azure.
Napiwek
W tym przykładzie przedstawiono prosty scenariusz bazy danych korzystający z bazy danych H2. Zalecamy używanie usługi Azure Database for MySQL lub Azure Database for PostgreSQL w środowisku produkcyjnym oraz przechowywanie adresu URL bazy danych, nazwy użytkownika i hasła w usłudze Azure Key Vault. Jeśli chcesz uniknąć hasła, połączenia bez hasła są dobrym wyborem. Aby uzyskać więcej informacji, zobacz Połączenia bez hasła dla usług platformy Azure.
Utwórz nową
Todo
klasę Języka Java. Ta klasa jest modelem domeny mapowanym na tabelętodo
, która zostanie automatycznie utworzona przez JPA. Poniższy kod ignoruje metodygetters
isetters
.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; }
Edytuj plik klasy uruchamiania, aby wyświetlić następującą zawartość.
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> { }
Uruchom aplikację. Aplikacja pobierze adres URL bazy danych H2 z usługi Key Vault, a następnie połączy się z bazą danych H2 i zapisze dane w bazie danych. Zobaczysz dzienniki podobne do następującego przykładu:
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
Wdrażanie do Azure Spring Apps
Teraz, gdy aplikacja Spring Boot działa lokalnie, nadszedł czas, aby przenieść ją do środowiska produkcyjnego. Usługa Azure Spring Apps ułatwia wdrażanie aplikacji Spring Boot na platformie Azure bez żadnych zmian w kodzie. Usługa zarządza infrastrukturą aplikacji Spring, aby deweloperzy mogli skupić się na swoim kodzie. Usługa Azure Spring Apps zapewnia zarządzanie cyklem życia przy użyciu wszechstronnego monitorowania i diagnostyki, zarządzania konfiguracją, automatycznego wykrywania usług, integracji CI/CD, wdrożeń blue-green i nie tylko. Aby wdrożyć aplikację w usłudze Azure Spring Apps, zobacz Wdrażanie pierwszej aplikacji w usłudze Azure Spring Apps.