我是 Azure 中的新用户。我创建了一个小应用程序,在 application.properties 文件中提到了一个秘密
JWT-SET-URI
。这个秘密,是我在azure key vaults
中创造的。
Spring启动版本:3.1.5
Azure 帐户:免费个人帐户(12 个月)
应用程序属性
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 登录方法的情况下尝试了以下代码,并使用服务主体、客户端凭据方法从密钥保管库检索了密钥。
代码:
SecretController.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
以下是我的密钥库中的秘密值。
我授予应用程序访问权限以从密钥库中检索机密,如下所示:
代码运行成功如下:
我从浏览器中的密钥保管库检索了密钥,如下所示。