Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este tutorial mostra-lhe como usar o Key Vault em aplicações Spring Boot para proteger dados de configuração sensíveis e recuperar propriedades de configuração do Key Vault. Key Vault fornece armazenamento seguro de segredos genéricos, como palavras-passe e cadeias de ligação à base de dados.
Pré-requisitos
- Uma subscrição do Azure - crie uma gratuitamente.
- Kit de Desenvolvimento Java (JDK) versão 8 ou superior.
- Apache Maven
- Azure CLI
- Uma instância do Key Vault. Se não tiveres um, vê Quickstart: Cria um cofre de chaves usando o portal Azure. Além disso, anota o URI da instância do Key Vault, pois precisas dele para a aplicação de teste deste tutorial.
- Um aplicativo Spring Boot. Se você não tiver um, crie um projeto Maven com o Spring Initializr. Certifique-se de selecionar Maven Project e, em Dependencies, adicionar as dependências Spring Web, Spring Data JPA e H2 Database, e depois selecione Java versão 8 ou superior.
Importante
O Spring Boot versão 2.5 ou superior é necessário para concluir as etapas neste artigo.
Definir um segredo em Azure Key Vault
Este tutorial descreve como ler credenciais de base de dados do Key Vault numa aplicação Spring Boot. Para ler as credenciais do Key Vault, deve primeiro armazenar as credenciais da base de dados no Key Vault.
Para armazenar o URL de uma base de dados H2 como um novo segredo em Key Vault, veja Quickstart: Definir e recuperar um segredo de Azure Key Vault usando o portal Azure. Neste tutorial, você definirá um segredo com nome h2url e valor jdbc:h2:~/testdb;user=sa;password=password.
Nota
Depois de definir o segredo, conceda acesso à sua aplicação no Key Vault seguindo as instruções em Atribuir uma política de acesso do Key Vault.
Leia um segredo do Azure Key Vault
Agora que as credenciais da base de dados foram armazenadas no Key Vault, pode recuperá-las com o Spring Cloud Azure.
Para instalar o módulo Spring Cloud Azure Key Vault Starter, adicione as seguintes dependências ao seu ficheiro pom.xml:
A Lista de Materiais Spring Cloud Azure (BOM):
<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>Nota
Se estiveres a usar o Spring Boot 4.0.x, certifica-te de definir a
spring-cloud-azure-dependenciesversão para7.1.0.Se estiveres a usar o Spring Boot 3.5.x, certifica-te de definir a
spring-cloud-azure-dependenciesversão para6.1.0.Se estiveres a usar o Spring Boot 3.1.x-3.5.x, certifica-te de definir a
spring-cloud-azure-dependenciesversão para5.25.0.Se você estiver usando o Spring Boot 2.x, certifique-se de definir a versão
spring-cloud-azure-dependenciescomo4.20.0.Esta lista de materiais (BOM) deve ser configurada na seção
<dependencyManagement>do seu arquivo pom.xml. Isto garante que todas as dependências do Spring Cloud Azure usam a mesma versão.Para mais informações sobre a versão usada nesta BOM, consulte Qual Versão do Spring Cloud Azure Devo Usar.
O artefacto inicial do Spring Cloud Azure Key Vault:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-keyvault</artifactId> </dependency>
O Spring Cloud Azure tem vários métodos para ler segredos do Key Vault. Você pode usar os seguintes métodos independentemente ou combiná-los para diferentes casos de uso:
- Utilize o SDK do Azure para Key Vault.
- Utilize o Spring KeyVault
PropertySource.
Utilize o SDK do Azure para Key Vault
Azure SDK para Key Vault proporciona SecretClient para administrar segredos no Key Vault.
O seguinte exemplo de código irá mostrar-lhe como usar SecretClient para obter credenciais de base de dados H2 a partir de Azure Key Vault.
Para ler um segredo usando o Azure SDK do Key Vault, configure a aplicação seguindo estes passos:
Configure um endpoint Key Vault no ficheiro de configuração application.properties.
spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/Injete o
SecretClientbean na sua aplicação Spring e use ogetSecretmétodo para recuperar um segredo, no exemplo a seguir: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()); } }Gorjeta
Neste tutorial, não há operações de autenticação nas configurações ou no código. No entanto, a ligação aos serviços do Azure requer autenticação. Para completar a autenticação, precisa de usar o Azure Identity. O Spring Cloud Azure utiliza
DefaultAzureCredential, que a biblioteca Azure Identity fornece para te ajudar a obter credenciais sem quaisquer alterações de código.DefaultAzureCredentialSuporta vários métodos de autenticação e determina qual método usar em tempo de execução. Essa abordagem permite que seu aplicativo use diferentes métodos de autenticação em ambientes diferentes (como ambientes locais e de produção) sem implementar código específico do ambiente. Para obter mais informações, consulte DefaultAzureCredential.Para completar a autenticação em ambientes de desenvolvimento locais, pode usar Azure CLI, Visual Studio Code, PowerShell ou outros métodos. Para mais informações, consulte Autenticação do Azure em ambientes de desenvolvimento Java. Para completar a autenticação em ambientes de alojamento Azure, recomendamos a utilização da identidade gerida atribuída pelo utilizador. Para mais informações, consulte O que são identidades geridas para Azure recursos?
Inicie a aplicação. Você verá logs semelhantes ao exemplo a seguir:
h2url: jdbc:h2:~/testdb;user=sa;password=password
Você pode construir o SecretClient feijão sozinho, mas o processo é complicado. Em aplicativos Spring Boot, você precisa gerenciar propriedades, aprender o padrão do construtor e registrar o cliente no contexto do aplicativo Spring. O exemplo de código a seguir mostra como você cria um 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();
}
}
A lista a seguir mostra alguns dos motivos pelos quais esse código não é flexível ou gracioso:
- O endpoint do Key Vault é codificado fixamente.
- Se você usar
@Valuepara obter configurações do ambiente Spring, não poderá ter dicas do IDE no arquivo application.properties . - Se você tiver um cenário de microsserviço, o código deve ser duplicado em cada projeto, e é fácil cometer erros e difícil ser consistente.
Felizmente, com o Spring Cloud Azure, não é necessário construir o bean SecretClient sozinho. Em vez disso, pode injetar diretamente SecretClient e usar as propriedades de configuração com que já está familiarizado para configurar Key Vault. Para obter mais informações, consulte Exemplos de configuração.
O Spring Cloud Azure também fornece as seguintes configurações globais para diferentes cenários. Para mais informações, consulte a configuração Global para SDKs de Serviço Azure do guia para programadores Spring Cloud Azure.
- Opções de proxy.
- Opções de repetição novamente.
- Opções do cliente de transporte HTTP.
Também podes ligar-te a diferentes clouds do Azure. Para mais informações, veja Conectar-se a diferentes nuvens Azure.
Utilize o Spring Key Vault PropertySource
As seções anteriores mostraram como usar SecretClient no CommandLineRunner para ler o segredo depois que o aplicativo foi iniciado. Em aplicativos Spring Boot, no entanto, a leitura de segredos é necessária antes que o aplicativo seja iniciado. Por exemplo, a propriedade de senha da fonte de dados é necessária antes que o aplicativo seja iniciado. O cenário anterior não funciona se quiseres guardar a palavra-passe da fonte de dados no Key Vault e ainda assim usar a configuração automática do Spring para obter uma fonte de dados.
Neste caso, o Spring Cloud Azure fornece integração com o ambiente Spring para carregar segredos do Key Vault antes de construir o contexto da aplicação. Você pode usar o segredo para construir e configurar o bean durante a inicialização do contexto do aplicativo Spring. Esta abordagem é uma forma transparente de aceder a segredos do Key Vault, e não são necessárias alterações no código.
O exemplo de código seguinte mostra-lhe como usar PropertySource para obter credenciais da base de dados H2 e construir a fonte de dados a partir de Azure Key Vault.
Para recuperar a URL de uma base de dados H2 do Key Vault e armazenar dados da base de dados H2 usando o Spring Data JPA, configure a aplicação seguindo estes passos:
Adicione as seguintes propriedades de endpoint do Key Vault e de origem de dados ao ficheiro de configuração 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.H2DialectGorjeta
Para exemplos de configuração de propriedades do Spring Cloud Azure, consulte a secção <>exemplos de configuração do guia para desenvolvedores
Spring Cloud Azure .Este exemplo é um cenário de banco de dados simples usando um banco de dados H2. Recomendamos utilizar o Azure Database for MySQL ou o Azure Database for PostgreSQL num ambiente de produção e armazenar o URL da base de dados, nome de utilizador e palavra-passe no Azure Key Vault. Se você quiser evitar a senha, conexões sem senha é uma boa escolha. Para mais informações, consulte Conexões sem palavra-passe para serviços Azure.
Cria uma nova classe
TodoJava. Esta classe é um modelo de domínio mapeado na tabelatodoque será criada automaticamente pela JPA. O código a seguir ignora osgettersmétodos esetters.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; }Edite o arquivo de classe de inicialização para mostrar o seguinte conteúdo.
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> { }Inicie a aplicação. A aplicação irá recuperar o URL da base de dados H2 do Key Vault, depois ligar-se à base de dados H2 e armazenar os dados na base de dados. Você verá logs semelhantes ao exemplo a seguir:
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
Desdobrar para o Azure Spring Apps
Agora que você tem o aplicativo Spring Boot em execução localmente, é hora de movê-lo para a produção. Azure Spring Apps facilita a implementação de aplicações Spring Boot para Azure sem quaisquer alterações de código. O serviço gerencia a infraestrutura dos aplicativos Spring para que os desenvolvedores possam se concentrar em seu código. O Azure Spring Apps oferece gestão do ciclo de vida através de monitorização e diagnóstico abrangentes, gestão de configuração, descoberta de serviços, integração CI/CD, implementações azul-verde e muito mais. Para implementar a sua aplicação para Azure Spring Apps, consulte Implante a sua primeira aplicação para Azure Spring Apps.