提问人:Sk Monjurul Haque 提问时间:11/7/2023 更新时间:11/15/2023 访问量:52
如何将Spring Boot中的azure key vault与属性源集成?
How to integrate azure key vault in spring boot with property source?
问:
我是 Azure 中的新手。我创建了一个小应用程序,其中我在application.properties文件中提到了一个秘密。秘密,我在.JWT-SET-URI
azure key vaults
Spring Boot 版本:3.1.5
Azure 帐户:免费的个人帐户(12 个月)
application.propeties
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=${JWT-SET-URI}
spring.cloud.azure.keyvault.secret.property-sources[0].enabled=true
spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=https://demo-vault.vault.azure.net/
我也安装了.一旦我运行命令,如果我启动应用程序,它就可以正常工作。但是当 不存在或运行命令时。应用程序未启动。Azure CLI
az login
Azure CLI
az logout
我的问题是,有什么方法可以在没有 ?Azure CLI
答:
我在没有 Azure CLI 登录方法的情况下尝试了以下代码,并使用服务主体客户端凭据方法从密钥保管库中检索了机密。
法典:
秘密控制器.java :
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class SecretController {
@Autowired
private KeyVaultService keyVaultService;
@GetMapping("/secret")
public String getSecret() {
return keyVaultService.getSecretValue();
}
}
KeyVaultService.java :
import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class KeyVaultService {
@Value("${azure.keyvault.vault-url}")
private String vaultUrl;
@Value("${azure.keyvault.client-id}")
private String clientId;
@Value("${azure.keyvault.client-secret}")
private String clientSecret;
@Value("${azure.keyvault.tenant-id}")
private String tenantId;
@Value("${azure.keyvault.secret-name}")
private String secretName;
public String getSecretValue() {
ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
.clientId(clientId)
.clientSecret(clientSecret)
.tenantId(tenantId)
.build();
SecretClient secretClient = new SecretClientBuilder()
.vaultUrl(vaultUrl)
.credential(clientSecretCredential)
.buildClient();
return secretClient.getSecret(secretName).getValue();
}
}
application.properties:
azure.keyvault.vault-url=https://<keyvault_name>.vault.azure.net
azure.keyvault.client-id=<app_client_id>
azure.keyvault.client-secret=<app_client-secret>
azure.keyvault.tenant-id=<tenant-id>
azure.keyvault.secret-name=kamsecret
下面是我在密钥保管库中的机密值。
我允许访问该应用程序以从密钥保管库中检索机密,如下所示:
代码成功运行,如下所示:
我从浏览器中的密钥保管库中检索了机密,如下所示。
评论
SecretClient
PropertySource
如果在本地运行应用时不需要确切的机密值(例如,因为你有一个具有不同 URL 和凭据的本地数据库),则只需使用本地测试替身来替换 Azure Key Vault。
此示例项目可以告诉你应如何完成 Spring 集成,以及如何将真正的 Azure Key Vault 替换为测试替身: https://github.com/nagyesta/lowkey-vault-example/tree/main#spring-cloud-azure-starter
评论