美文网首页
springboot集成springcloud vault读值示

springboot集成springcloud vault读值示

作者: haiyong6 | 来源:发表于2021-07-08 19:40 被阅读0次

接上三篇
Vault---机密信息管理工具安装及常用示例
Vault机密管理工具集群配置示例
vault签发根证书、中间证书、ca证书流程记录
项目里打算把所有密码都放到vault里管理,vault提供了springcloud vault用来在springboot里连接vault,启动加载vault里的值放到spring中,极端点,vault的kv引擎甚至可以做分布式配置中心来用,来替代nacos的配置中心功能,当然这样用的人还比较少。

maven引入:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-vault-config</artifactId>
    <version>3.0.3</version>
</dependency>

bootstrap.yml里加入:

spring:
  cloud:
    vault:
      application-name: venucia_fota_kv
      host: 127.0.0.1
      port: 8200
      scheme: http
      authentication: TOKEN
      token: xxxtoken
      connection-timeout: 5000
      read-timeout: 15000
      config:
        order: -10
      kv:
        enabled: true
        backend: kvTest
        profile-separator: /
        application-name: /ota/pwd

注意springcloud vault源码里对启动顺序定义的很靠前,所以最好不要放到nacos里,它会在nacos加载配置文件前就生效,如果放到nacos里会报缺少token的错误。springcloud vault代码侵入性很小,只要引入jar包,配到springboot里就可以生效。

假设我们在vault里新建一个kvTest的kv引擎,在

kvTest/ota/pwd

路径存储了一系列json数据比如:

{"mysql-pwd":"xxxpsd"}

上面的配置文件中backend代表的是引擎名称,application-name如果不指定,默认拿spring.application.name,指定了路径就是自定义的路径

如此,在springboot启动后,如果vault正常连接,且配置在这里的token有该引擎的访问权限的话,就可以把vault里面存储的json值(key,value)放入spring里,我们在项目里或nacos里用$就可以输出或者用java输出。
如:
nacos里或者配置文件里

${mysql-pwd}

java代码里:

@Value("${mysql-pwd}")

或import org.springframework.core.env.Environment里拿:

Environment config = SpringContextUtil.getApplicationContext().getEnvironment();
String value = config.getProperty("mysql-pwd");
System.out.println("===" + value);

补充SpringContextUtil:

package ly.mp.project.common.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component("springContextUtil")
public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext; // Spring应用上下文环境

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) applicationContext.getBean(name);
    }

    @SuppressWarnings("unchecked")
    public static <T> T getBean(Class<?> clz) throws BeansException {
        return (T) applicationContext.getBean(clz);
    }
}

别忘了给这个token最基本的policy权限:

path "kvTest/*" {
    capabilities = ["read", "list"]
}
path "secret/*"{
  capabilities = ["read", "list"]
}

springcloud vault会自动续期token

vault创建的token默认最长只有768h的有效期,也就是32天左右,但是springcloud vault jar包里做了自动续期的操作,实测在token将要过期前的5秒到3秒内会自动向vault发送renew-self请求实现自动续期,所以理论上只要项目在过期前的那个时间点还在运行,就可以自动续期。

如此,就可以把项目里的所有密码都放到vault里管理了,比如mysql密码,elasticsearch密码等等,要比直接放在nacos里更安全。

相关文章

网友评论

      本文标题:springboot集成springcloud vault读值示

      本文链接:https://www.haomeiwen.com/subject/mfbtpltx.html