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

方式一:

#nacos配置文件data.yml:
spring:cloud:nacos:discovery:ip: ****.comport: 80datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://*********/database?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNullhikari:idle-timeout: 60000connection-timeout: 60000validation-timeout: 3000login-timeout: 5max-lifetime: 60000maximum-pool-size: 20#项目配置文件bootstrap-test.yml
spring:cloud:nacos:discovery:server-addr: http://nacos-headless:8848config:server-addr: http://nacos-headless:8848namespace: TESTfile-extension: ymlextension-configs:- group: DEFAULT_GROUPdata-id: global.yml- group: commondata-id: common.yml- group: datadata-id: db.ymlrefresh: truesm: region: eu-central-1doc: dev-fra-as-api-mongodb-user-root-ZMEAVyQppET6GPfrdsp: dev-fra-as-api-rds-user-root-xp78N8GvtScLmGnrdss: 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 {@Overridepublic 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();}}

方式二:

src/main/resources/META-INF/spring.factories
org.springframework.boot.env.EnvironmentPostProcessor=com.yuruo.reco.config.SecretsManagerEnvironmentPostProcessorspring:jpa:properties:hibernate:dialect: org.hibernate.dialect.MySQL8Dialectcloud:nacos:discovery:ip: ****.comport: 80datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://*********/database?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNullusername: ${DB_USETRNAME}password: ${DB_PASSWORD}hikari:idle-timeout: 60000connection-timeout: 60000validation-timeout: 3000login-timeout: 5max-lifetime: 60000maximum-pool-size: 20package 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 {@Overridepublic 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();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/712310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 商机管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 商机管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

LeetCode142. 环形链表 II刷题详解

今天力扣刷到了一个特别有意思的题目&#xff0c;于是就写了下面的题解来加深以下理解。 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 这个可以分为两大步去写&#xff0c;首先要判断链表是否有环&#xff0c;然后如果有环就去找到环的入口&#xff0c;没有环返…

python3.x的在线与离线安装纯净版

由于计划搭建一套使用python自动分析日志的流程&#xff0c;发现我们的测试环境CentOS 7仍然没有安装python3&#xff0c;无法使用这些新的库。Python 3在设计上着重提升了语言的一致性和易用性&#xff0c;它引入了许多关键改进&#xff0c;此外&#xff0c;Python 3环境拥有丰…

基于springboot+html实现的衣物捐赠平台

一、系统架构 前端&#xff1a;html | layui | jquery | css 后端&#xff1a;springboot | thymeleaf | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 注册 03. web页-首页 04. web页-捐赠衣服 05. web页-论坛交流…

C# 中的 IReadOnlyDictionary 和 IReadOnlyList

C# 中的 IReadOnlyDictionary 和 IReadOnlyList 是接口&#xff0c;用于表示只读的字典和只读的列表。这些接口提供了对集合的只读访问权限&#xff0c;即不允许对集合进行修改操作&#xff0c;例如添加、删除或修改元素。这种只读特性对于需要保护数据完整性或只需要进行读取操…

MYSQL--锁机制*

一.对锁机制的大概介绍: 1.大概的来说,MYSQL当中的锁实际上就是合理的管理多个服务器对于同一个共享资源的使用,是计算机协调多个进程或者是线程并发访问某一资源的机制(避免争抢资源的现象发生) 2.在数据库当中,数据是一种可以供许多的用户进行共享使用的资源,如何保证数据并发…

软考笔记--软件开发模型

软件开发模型给出了软件开发活动各个阶段之间的关系&#xff0c;它是软件开发过程的概括&#xff0c;是软件工程的重要内容。软件开发模型为软件工程管理提供了里程碑和进度表&#xff0c;为软件开发过程提供了原则和方法。 一.软件开发模型概述 软件开发模型可分为三种类型&…

第十一届蓝桥杯省赛第一场C++ A组 / B组《整数拼接》(c++)

1.题目说明 给定一个长度为 n 的数组 A1,A2,⋅⋅⋅,An。 你可以从中选出两个数 Ai 和 Aj(i 不等于 j)&#xff0c;然后将 Ai 和 Aj 一前一后拼成一个新的整数。 例如 12 和 345 可以拼成 12345 或 34512。 注意交换 Ai 和 Aj 的顺序总是被视为 2 种拼法&#xff0c;即便是 …

考研倒计时半年:如何高效安排学习计划?

距离考研还有半年的时间&#xff0c;这是一个既紧张又充满希望的阶段。如何利用好这段时间&#xff0c;制定一个高效的学习计划&#xff0c;成为了每位考生关注的焦点。下面&#xff0c;我将为大家提供一些关于政治、英语和专业课的学习建议&#xff0c;希望能对大家有所帮助。…

曲线的凹凸性与拐点【高数笔记】

1.什么是曲线的凹凸性 2.什么是曲线的拐点 3.拐点的特征 4.拐点与驻点有什么不同 5.拐点的表示方法与驻点有什么不一样 6.拐点与凹凸区间怎么求

力扣121题: 买卖股票的最佳时机

【题目描述】 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最…

Mathtype安装时word启动显示“文件未找到:MathPage.WLL”

背景 由于老板布置的临时工作&#xff0c;需要安装Mathtype&#xff0c;但尝试了3个不同的版本后&#xff08;每次都卸载干净了&#xff09;&#xff0c;均未能成功安装&#xff0c;出现的报错3个版本各不相同&#xff1a; ①解压安装过程中失败&#xff08;这个版本不再尝试…

GoFrame:如何简单地搭建一个简单地微服务

一切资料来源于GoFrame官网, 感兴趣的, 可以直接去官网查阅相关资料。 首先下载框架工具, 下载地址:https://github.com/gogf/gf/releases 然后进入你想要放置的项目文件夹, 执行命令行 gf init {project_name} #project_name为你的项目名 执行完后项目结构如图所示 然…

同等学力申硕专业介绍——教育学硕士

同等学力申硕的专业很多。 目前有十三大门类&#xff0c;分别是医学、法学、管理学、工学、教育学、经济学、艺术学、文学、历史学、理学、哲学、农学、军事学等&#xff0c;每个大门类中都有很多的细分专业。 今天为大家介绍同等学力申硕专业——教育学。 专业介绍 教育学该…

基于java+springboot动物检疫信息管理系统设计和实现

基于java SSM springboot动物检疫信息管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…

【寸铁的刷题笔记】树、dfs、bfs、回溯、递归(三)

【寸铁的刷题笔记】树、dfs、bfs、回溯、递归(三) 大家好 我是寸铁&#x1f44a; 金三银四&#xff0c;树、dfs、bfs、回溯、递归是必考的知识点✨ 快跟着寸铁刷起来&#xff01;面试顺利上岸&#x1f44b; 喜欢的小伙伴可以点点关注 &#x1f49d; 530. 二叉搜索树的最小绝对差…

考研政治这样复习更高效

政治复习是考研备考中的重要一环&#xff0c;需要考生制定科学的复习计划&#xff0c;注重知识点的掌握和解题技巧的提升。以下是一些政治复习的建议&#xff1a; 梳理知识框架&#xff1a;首先&#xff0c;需要梳理政治学科的知识框架&#xff0c;了解各个章节之间的内在联系…

【Vue3】自定义 Vue3 插件(全局实现页面加载动画)

// main.ts import { createApp } from vue import App from ./App.vue import Loading from "./components/Loading/index.ts";const app createApp(App) type Lod {show: () > void,hide: () > void } //编写ts loading 声明文件放置报错 和 智能提示 decl…

python实现常见一元随机变量的概率分布

一. 随机变量 随机变量是一个从样本空间 Ω \Omega Ω到实数空间 R R R的函数&#xff0c;比如随机变量 X X X可以表示投骰子的点数。随机变量一般可以分为两类&#xff1a; 离散型随机变量&#xff1a;随机变量的取值为有限个。连续型随机变量&#xff1a;随机变量的取值是连…

Redis 群集部署

1.关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型基础上&#xff0c;-般面向记录。它借助于集合代数等数学概念和方法来处理数据库中的数据。关系模型指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。现实世界中…