Spring 将从 Key vault 读取配置并连接到 SQL 的启动应用程序?
Spring boot application that would read configuration from Key vault and connect to SQL?
我不是 Java/Spring 引导开发人员,但我想构建一个简单的 Spring 引导应用程序,它将从 Key vault 读取配置并连接到 SQL。
对于其中的每一个,我都有两个单独的解决方案
Key Vault 解决方案是从 Azure Key Vault 读取机密
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Value;
@SpringBootApplication
@RestController
public class KeyvaultApplication {
public static void main(String[] args) {
SpringApplication.run(KeyvaultApplication.class, args);
}
@GetMapping("get")
public String get() {
return connectionString;
}
@Value("${connectionString}")
private String connectionString;
public void run(String... varl) throws Exception {
System.out.println(String.format("\nConnection String stored in Azure Key Vault:\n%s\n",connectionString));
}
}
application.properties
azure.keyvault.client-id=xxxx
azure.keyvault.client-key=xxxx
azure.keyvault.enabled=true
azure.keyvault.tenant-id=xxxxx
azure.keyvault.uri=https://xxxxx-keyvault85.vault.azure.net/
============================================= =========================
和SQL 将数据插入 Azure SQL 数据库的解决方案
application.properties
logging.level.org.springframework.jdbc.core=DEBUG
spring.datasource.url=jdbc:sqlserver://xxxx-sql.database.windows.net:1433;database=demo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
spring.datasource.username=spring@databasename
spring.datasource.password=Password
spring.datasource.initialization-mode=never
TodoController.java
package com.example.demo;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/")
public class TodoController {
private final TodoRepository todoRepository;
public TodoController(TodoRepository todoRepository) {
this.todoRepository = todoRepository;
}
@PostMapping("/")
@ResponseStatus(HttpStatus.CREATED)
public Todo createTodo(@RequestBody Todo todo) {
return todoRepository.save(todo);
}
@GetMapping("/")
public Iterable<Todo> getTodos() {
return todoRepository.findAll();
}
}
TodoRepository.java
package com.example.demo;
import org.springframework.data.repository.CrudRepository;
public interface TodoRepository extends CrudRepository<Todo, Long> {
}
Todo.java
package com.example.demo;
import org.springframework.data.annotation.Id;
public class Todo {
public Todo() {
}
public Todo(String description, String details, boolean done) {
this.description = description;
this.details = details;
this.done = done;
}
@Id
private Long id;
private String description;
private String details;
private boolean done;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
public boolean isDone() {
return done;
}
public void setDone(boolean done) {
this.done = done;
}
}
这两个解决方案都独立工作,但我想结合这些解决方案,以便我可以从 Azure Key vault 读取 SQL 配置并连接到 Azure SQL 数据库。我该如何实现?
你可以参考这份文件:Tutorial: Reading a secret from Azure Key Vault in a Spring Boot application:
Spring 启动应用程序会将用户名和密码等敏感信息外化。将敏感信息外部化可以实现更好的可维护性、可测试性和安全性。将秘密存储在代码之外比对信息进行硬编码或在构建时内联要好。
本教程介绍如何创建一个 Spring 启动应用程序,从 Azure Key Vault 读取值,然后将该应用程序部署到 Azure 应用服务和 Azure Spring 云。
Add Key Vault integration to the app 的摘要:
按照以下步骤将必要的配置添加到 application.properties 文件。
在编辑器中打开 src/main/resources/application.properties 并制作
它具有以下内容,调整您的 Azure 的值
订阅。
azure.keyvault.client-id=685on005-ns8q-4o04-8s16-n7os38o2ro5n
azure.keyvault.client-key=4bt.lCKJKlbYLn_3XF~wWtUwyHU0jKggu2
azure.keyvault.enabled=true
azure.keyvault.tenant-id=72s988os-86s1-41ns-91no-2q7pq011qo47
azure.keyvault.uri=https://contosokv.vault.azure.net/
可用属性的完整列表记录在
property reference.
保存并关闭文件。
对 KeyvaultApplication.java 文件(或任何 class 文件的名称进行简单更改)。
打开src/main/java/com/contoso/keyvault/KeyvaultApplication.java
文本编辑器。
添加这个导入。
import org.springframework.beans.factory.annotation.Value;
给connectionString实例变量添加注解。
@Value("${connectionString}")
private String connectionString;
Key Vault 集成提供了一个 Spring PropertySource
从
Key Vault 的值。一些更多的实施细节可以在
reference documentation.
在顶级 keyvault 目录中,pom.xml 文件所在的位置
找到,输入 mvn clean package spring-boot:run
.
命令输出信息初始化完成表示
服务器已准备就绪。在单独的 shell window 中输入此命令。
Bash
$ curl http://localhost:8080/get
输出将显示
jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE
而不是
defaultValue
.
杀死来自 mvn spring-boot:run
的 运行 进程。你可以
键入 Ctrl-C 或者您可以使用 jps
命令获取
Launcher
处理并杀死它。
希望能帮到你。
您可以使用“-”而不是“.”来定义属性
例如:
spring.datasource.username=spring@数据库名
在 Azure CLI 中:
az keyvault secret set --name "spring-datasource-username" --vault-name "your-key-vault" --value "spring@databasename"
或在 Azure 门户中:
你的密钥库应该是这个
name:
spring-datasource-username
value:
spring@databasename
根据我对这个版本的尝试
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
<version>2.1.7</version>
</dependency>
只需要3个参数。
YAML 文件
azure:
keyvault:
client-id: xxxxxxx
client-key: xxxxxxyyyyy
enabled: true
uri: https://xxx.vault.azure.net/
然后配置class
@Configuration
public class AzureConfig {
@Value("${azure.keyvault.client-id}")
private String clientId;
@Value("${azure.keyvault.client-key}")
private String clientSecret;
@Bean
public KeyVaultClient keyVaultClient() {
ServiceClientCredentials credentials = new AzureKeyVaultCredential(clientId, clientSecret);
return new KeyVaultClient(credentials);
}
}
然后在服务 class 中自动装配 keyVaultClient
以设置或获取
SetSecretRequest secretRequest = new Builder(keyVaultUrl, key, value).build();
keyVaultClient.setSecret(secretRequest);
keyVaultUrl
是密钥保管库主机 url 就像 https://xxx.vault.azure.net/
我不是 Java/Spring 引导开发人员,但我想构建一个简单的 Spring 引导应用程序,它将从 Key vault 读取配置并连接到 SQL。
对于其中的每一个,我都有两个单独的解决方案
Key Vault 解决方案是从 Azure Key Vault 读取机密
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Value;
@SpringBootApplication
@RestController
public class KeyvaultApplication {
public static void main(String[] args) {
SpringApplication.run(KeyvaultApplication.class, args);
}
@GetMapping("get")
public String get() {
return connectionString;
}
@Value("${connectionString}")
private String connectionString;
public void run(String... varl) throws Exception {
System.out.println(String.format("\nConnection String stored in Azure Key Vault:\n%s\n",connectionString));
}
}
application.properties
azure.keyvault.client-id=xxxx
azure.keyvault.client-key=xxxx
azure.keyvault.enabled=true
azure.keyvault.tenant-id=xxxxx
azure.keyvault.uri=https://xxxxx-keyvault85.vault.azure.net/
============================================= =========================
和SQL 将数据插入 Azure SQL 数据库的解决方案
application.properties
logging.level.org.springframework.jdbc.core=DEBUG
spring.datasource.url=jdbc:sqlserver://xxxx-sql.database.windows.net:1433;database=demo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
spring.datasource.username=spring@databasename
spring.datasource.password=Password
spring.datasource.initialization-mode=never
TodoController.java
package com.example.demo;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/")
public class TodoController {
private final TodoRepository todoRepository;
public TodoController(TodoRepository todoRepository) {
this.todoRepository = todoRepository;
}
@PostMapping("/")
@ResponseStatus(HttpStatus.CREATED)
public Todo createTodo(@RequestBody Todo todo) {
return todoRepository.save(todo);
}
@GetMapping("/")
public Iterable<Todo> getTodos() {
return todoRepository.findAll();
}
}
TodoRepository.java
package com.example.demo;
import org.springframework.data.repository.CrudRepository;
public interface TodoRepository extends CrudRepository<Todo, Long> {
}
Todo.java
package com.example.demo;
import org.springframework.data.annotation.Id;
public class Todo {
public Todo() {
}
public Todo(String description, String details, boolean done) {
this.description = description;
this.details = details;
this.done = done;
}
@Id
private Long id;
private String description;
private String details;
private boolean done;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
public boolean isDone() {
return done;
}
public void setDone(boolean done) {
this.done = done;
}
}
这两个解决方案都独立工作,但我想结合这些解决方案,以便我可以从 Azure Key vault 读取 SQL 配置并连接到 Azure SQL 数据库。我该如何实现?
你可以参考这份文件:Tutorial: Reading a secret from Azure Key Vault in a Spring Boot application:
Spring 启动应用程序会将用户名和密码等敏感信息外化。将敏感信息外部化可以实现更好的可维护性、可测试性和安全性。将秘密存储在代码之外比对信息进行硬编码或在构建时内联要好。
本教程介绍如何创建一个 Spring 启动应用程序,从 Azure Key Vault 读取值,然后将该应用程序部署到 Azure 应用服务和 Azure Spring 云。
Add Key Vault integration to the app 的摘要:
按照以下步骤将必要的配置添加到 application.properties 文件。
在编辑器中打开 src/main/resources/application.properties 并制作 它具有以下内容,调整您的 Azure 的值 订阅。
azure.keyvault.client-id=685on005-ns8q-4o04-8s16-n7os38o2ro5n azure.keyvault.client-key=4bt.lCKJKlbYLn_3XF~wWtUwyHU0jKggu2 azure.keyvault.enabled=true azure.keyvault.tenant-id=72s988os-86s1-41ns-91no-2q7pq011qo47 azure.keyvault.uri=https://contosokv.vault.azure.net/
可用属性的完整列表记录在 property reference.
保存并关闭文件。
对 KeyvaultApplication.java 文件(或任何 class 文件的名称进行简单更改)。
打开src/main/java/com/contoso/keyvault/KeyvaultApplication.java 文本编辑器。
添加这个导入。
import org.springframework.beans.factory.annotation.Value;
给connectionString实例变量添加注解。
@Value("${connectionString}") private String connectionString;
Key Vault 集成提供了一个 Spring
PropertySource
从 Key Vault 的值。一些更多的实施细节可以在 reference documentation.在顶级 keyvault 目录中,pom.xml 文件所在的位置 找到,输入
mvn clean package spring-boot:run
.命令输出信息初始化完成表示 服务器已准备就绪。在单独的 shell window 中输入此命令。
Bash $ curl http://localhost:8080/get
输出将显示
jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE
而不是defaultValue
.杀死来自
mvn spring-boot:run
的 运行 进程。你可以 键入 Ctrl-C 或者您可以使用jps
命令获取Launcher
处理并杀死它。
希望能帮到你。
您可以使用“-”而不是“.”来定义属性
例如: spring.datasource.username=spring@数据库名
在 Azure CLI 中:
az keyvault secret set --name "spring-datasource-username" --vault-name "your-key-vault" --value "spring@databasename"
或在 Azure 门户中:
你的密钥库应该是这个
name:
spring-datasource-username
value:
spring@databasename
根据我对这个版本的尝试
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
<version>2.1.7</version>
</dependency>
只需要3个参数。
YAML 文件
azure:
keyvault:
client-id: xxxxxxx
client-key: xxxxxxyyyyy
enabled: true
uri: https://xxx.vault.azure.net/
然后配置class
@Configuration
public class AzureConfig {
@Value("${azure.keyvault.client-id}")
private String clientId;
@Value("${azure.keyvault.client-key}")
private String clientSecret;
@Bean
public KeyVaultClient keyVaultClient() {
ServiceClientCredentials credentials = new AzureKeyVaultCredential(clientId, clientSecret);
return new KeyVaultClient(credentials);
}
}
然后在服务 class 中自动装配 keyVaultClient
以设置或获取
SetSecretRequest secretRequest = new Builder(keyVaultUrl, key, value).build();
keyVaultClient.setSecret(secretRequest);
keyVaultUrl
是密钥保管库主机 url 就像 https://xxx.vault.azure.net/