springboot + nacos + aws secretmanager 做账号密码隐私处理

方式一:

java 复制代码
#nacos配置文件

data.yml:
spring:
  cloud:
    nacos:
      discovery:
        ip: ****.com
        port: 80
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://*********/database?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
    hikari:
      idle-timeout: 60000
      connection-timeout: 60000
      validation-timeout: 3000
      login-timeout: 5
      max-lifetime: 60000
      maximum-pool-size: 20

#项目配置文件

bootstrap-test.yml
spring:
  cloud:
    nacos:
      discovery:
        server-addr: http://nacos-headless:8848
      config:
        server-addr: http://nacos-headless:8848
        namespace: TEST
        file-extension: yml
        extension-configs:
          - group: DEFAULT_GROUP
            data-id: global.yml
          - group: common
            data-id: common.yml
          - group: data
            data-id: db.yml
            refresh: true

sm: 
  region: eu-central-1
  doc: dev-fra-as-api-mongodb-user-root-ZMEAVyQppET6GPf
  rdsp: dev-fra-as-api-rds-user-root-xp78N8GvtScLmGn
  rdss: dev-fra-as-pms-rds-v2-readonly-from-sin-user-fra-appplayer-gp3Sex9vbXDU6PL



代码

package com.yuruo.reco.config;

import java.util.HashMap;
import java.util.Map;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;

import com.yuruo.reco.dto.SecretDto;
import com.yuruo.reco.utils.JsonUtils;

import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;

public class SecretsManagerEnvironmentPostProcessor implements EnvironmentPostProcessor {

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        MutablePropertySources propertySources = environment.getPropertySources();
        for (PropertySource<?> propertySource : propertySources) {
            if (propertySource.getName().contains("[bootstrap-" + environment.getActiveProfiles()[0] + ".yml]")) {
                Region region = Region.of(propertySource.getProperty("sm.region").toString());
                SecretsManagerClient client = SecretsManagerClient.builder().region(region).credentialsProvider(DefaultCredentialsProvider.create()).build();
                // 读取配置
                String primarySecret = getSecretRes(client, propertySource.getProperty("sm.rdsp").toString());
                SecretDto secret = JsonUtils.stringToJavaObject(primarySecret, SecretDto.class);
                Map<String, Object> source = new HashMap<>();
                source.put("spring.datasource.primary.username", secret.getUsername());
                source.put("spring.datasource.primary.password", secret.getPassword());
                String secondarySecret = getSecretRes(client, propertySource.getProperty("sm.rdss").toString());
                secret = JsonUtils.stringToJavaObject(secondarySecret, SecretDto.class);
                source.put("spring.datasource.secondary.username", secret.getUsername());
                source.put("spring.datasource.secondary.password", secret.getPassword());
                String mongosecret = getSecretRes(client, propertySource.getProperty("sm.doc").toString());
                secret = JsonUtils.stringToJavaObject(mongosecret, SecretDto.class);
                source.put("spring.data.mongodb.uri", "mongodb://" + secret.getUsername() + ":" + secret.getPassword()
                        + "@" + secret.getHost() + ":" + secret.getPort());
                propertySources.addLast(new MapPropertySource("secretsManagerPropertySource", source));
            }
        }
    }

    private String getSecretRes(SecretsManagerClient client, String secretName) {
        GetSecretValueRequest request = GetSecretValueRequest.builder().secretId(secretName).build();
        return client.getSecretValue(request).secretString();
    }

}

方式二:

java 复制代码
src/main/resources/META-INF/spring.factories
org.springframework.boot.env.EnvironmentPostProcessor=com.yuruo.reco.config.SecretsManagerEnvironmentPostProcessor


spring:
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
  cloud:
    nacos:
      discovery:
        ip: ****.com
        port: 80
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://*********/database?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
    username: ${DB_USETRNAME}
    password: ${DB_PASSWORD}
    hikari:
      idle-timeout: 60000
      connection-timeout: 60000
      validation-timeout: 3000
      login-timeout: 5
      max-lifetime: 60000
      maximum-pool-size: 20

package com.yuruo.reco.config;

import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;

import com.yuruo.reco.constant.SecretConstant;
import com.yuruo.reco.dto.SecretDto;
import com.yuruo.reco.utils.JsonUtils;

import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;

public class SecretsManagerEnvironmentPostProcessor implements EnvironmentPostProcessor {

	@Override
	public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
		Region region = Region.of(SecretConstant.SECRET_REGION);
		SecretsManagerClient client = SecretsManagerClient.builder().region(region).credentialsProvider(DefaultCredentialsProvider.create()).build();

		String primarySecret = getSecretRes(client, SecretConstant.SECRET_PRIMARY);
		if(StringUtils.isNotBlank(primarySecret)) {
			SecretDto secret = JsonUtils.stringToJavaObject(primarySecret, SecretDto.class);
			System.setProperty("DB1_USETRNAME", secret.getUsername());
			System.setProperty("DB1_PASSWORD", secret.getPassword());
		}

		String secondarySecret = getSecretRes(client, SecretConstant.SECRET_SECONDARY);
		if(StringUtils.isNotBlank(secondarySecret)) {
			SecretDto secret = JsonUtils.stringToJavaObject(secondarySecret, SecretDto.class);
			System.setProperty("DB2_USETRNAME", secret.getUsername());
			System.setProperty("DB2_PASSWORD", secret.getPassword());
		}

		String mongosecret = getSecretRes(client, SecretConstant.SECRET_MONGO);
		if(StringUtils.isNotBlank(mongosecret)) {
			SecretDto secret = JsonUtils.stringToJavaObject(mongosecret, SecretDto.class);
			System.setProperty("MGDB_URI", "mongodb://"+secret.getUsername()+":"+secret.getPassword()+"@"+ secret.getHost()+":"+secret.getPort()+"/?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false");
		}

	}

	private String getSecretRes(SecretsManagerClient client, String secretName) {
		GetSecretValueRequest request = GetSecretValueRequest.builder().secretId(secretName).build();
		return client.getSecretValue(request).secretString();
	}

}
相关推荐
摇滚侠5 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 32
spring boot·笔记·后端
卓怡学长13 小时前
w210基于springboot反诈平台设计与实现
java·spring boot·spring·intellij-idea
大模型丫丫14 小时前
如何提升单体 Spring Boot 应用的并发数?
java·spring boot·后端
RuoyiOffice15 小时前
SpringBoot3+Vue3 最推荐的开源 OA 系统 2026:流程驱动、资源闭环、多端互通
spring boot·vue3·flowable·oa·协同办公·spring boot 3·开源oa
计算机毕设定制辅导-无忧学长15 小时前
基于Spring Boot的玄幻小说个性化推荐平台设计与实现
java·vue.js·spring boot·后端·mysql·推荐算法
Harry Lei15 小时前
长期记忆系统的设计与实现
spring boot·postgresql·embedding
卓怡学长17 小时前
w156一周穿搭App的设计与实现
java·spring boot·spring·maven·intellij-idea
步行cgn18 小时前
Spring Boot 绑定简单 Bean 详解
java·spring boot·后端
爱折腾的编程老炮19 小时前
潮玩品牌自建抽盒机小程序——商城 + 抽盒 + 一番赏 + 会员 + 社区,一套代码怎么搭
spring boot·小程序·vue·mybatis·uniapp
谢亮_vipxieliang20 小时前
ValidX vs Google Guava Preconditions:验证 vs 断言
java·spring boot·后端·spring cloud·hibernate·guava