如何将Spring Boot中的azure key vault与属性源集成?

How to integrate azure key vault in spring boot with property source?

提问人:Sk Monjurul Haque 提问时间:11/7/2023 更新时间:11/15/2023 访问量:52

问:

我是 Azure 中的新手。我创建了一个小应用程序,其中我在application.properties文件中提到了一个秘密。秘密,我在.JWT-SET-URIazure 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 CLIaz loginAzure CLIaz logout

我的问题是,有什么方法可以在没有 ?Azure CLI

作为参考,我遵循了以下文档:https://learn.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-key-vault

spring-boot azure azure-keyvault

评论

0赞 Arko 11/7/2023
看看这个 - stackoverflow.com/questions/64876781/...

答:

0赞 Dasari Kamali 11/8/2023 #1

我在没有 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

下面是我在密钥保管库中的机密值。

enter image description here

我允许访问该应用程序以从密钥保管库中检索机密,如下所示:

enter image description here

代码成功运行,如下所示:

enter image description here

我从浏览器中的密钥保管库中检索了机密,如下所示。

enter image description here

评论

0赞 Sk Monjurul Haque 11/9/2023
嗨,@dasari-kamali,感谢您的回复。但是,在这里您使用了.我想使用,因为我在启动应用程序时需要秘密值。例如,数据源用户名、密码、用于连接到数据库的 url。SecretClientPropertySource
0赞 Esta Nagy 11/15/2023 #2

如果在本地运行应用时不需要确切的机密值(例如,因为你有一个具有不同 URL 和凭据的本地数据库),则只需使用本地测试替身来替换 Azure Key Vault。

此示例项目可以告诉你应如何完成 Spring 集成,以及如何将真正的 Azure Key Vault 替换为测试替身: https://github.com/nagyesta/lowkey-vault-example/tree/main#spring-cloud-azure-starter