数据源及nacos密文密码解密
数据源及nacos密文密码解密
数据源密码解密
数据源依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
这个不重要,先记下来,怕后面忘了。
数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: # 驱动
url: # 数据库地址
username: #数据库账号
password: #数据库密文密码
这里数据库密码配置的密文,我们需要在连接数据库之前进行解密。
数据源密码解密
1. 创建MyDruidDataSourceWrapper类
继承DruidDataSourceWrapper类,创建MyDruidDataSourceWrapper类,重写afterPropertiesSet方法。
@Override
public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
// 解密前密码
String password = super.getPassword();
// DecryptUtils为解密工具类,这里就不写了,只要能获取到明文密码即可
// 解密后密码
String newPassword = DecryptUtils.decrypt(password);
// 将解密后的密码设置进去
super.setPassword(newPassword);
}
账号解密同样可以使用此类逻辑。
2. 创建MyDruidDataSourceAutoConfigure类
模仿DruidDataSourceAutoConfigure类,创建MyDruidDataSourceAutoConfigure类。将dataSource方法中的new DruidDataSourceWrapper()改成new MyDruidDataSourceWrapper()即可。
DruidDataSourceAutoConfigure类中dataSource方法上有个@ConditionalOnMissingBean注解,意思只要我们的MyDruidDataSourceAutoConfigure类中的DataSource提前注入到ioc容器,那么它便不会加载,只走我们写的逻辑了。
3. 配置spring.factories
在resources下的META-INF目录中配置spring.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=xxx.MyDruidDataSourceAutoConfigure
nacos注册中心密码解密
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
配置
spring:
cloud:
nacos:
username: nacos
password: # 密文密码
discovery:
enabled: true
server-addr: # nacos地址
namespace: # 命名空间
这里配置中心密码配置的是密文,需要在创建连接之前进行解密。
密码解密
1. 创建MyNacosDiscoveryProperties类
继承NacosDiscoveryProperties类,创建MyNacosDiscoveryProperties类,重写getNacosProperties方法。
@Override
public Properties getNacosProperties() {
Properties nacosProperties = super.getNacosProperties();
// 解密前密码
String password = nacosProperties.get("password");
// 解密后密码
String newPassword = DecryptUtils.decrypt(password);
// 将解密后的密码设置进去
nacosProperties.setProperty("password", newPassword);
return nacosProperties;
}
账号解密同样可以使用此类逻辑。
2. 创建MyNacosDiscoveryAutoConfiguration类
模仿NacosDiscoveryAutoConfiguration类,创建MyNacosDiscoveryAutoConfiguration类。将nacosProperties方法中的new NacosDiscoveryProperties()改成new MyNacosDiscoveryProperties()即可。
NacosDiscoveryAutoConfiguration类中nacosProperties方法上有个@ConditionalOnMissingBean注解,意思只要我们的MyNacosDiscoveryAutoConfiguration类中的NacosDiscoveryProperties提前注入到ioc容器,那么它便不会加载,只走我们写的逻辑了。
3. 配置spring.factories
在resources下的META-INF目录中配置spring.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=xxx.MyNacosDiscoveryAutoConfiguration
nacos配置中心密码解密
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.1</version>
</dependency>
配置
spring:
cloud:
nacos:
config:
enabled: true
username: nacos
password: # 密文密码
server-addr: # nacos地址
namespace: # 命名空间
密码解密
nacos配置密码解密本也想同上面一样,继承NacosConfigProperties类穿管MyNacosConfigProperties类,然后模仿NacosConfigBootstrapConfiguration类更改nacosConfigProperties方法来实现,结果NacosConfigBootstrapConfiguration类无论如何都会比你提前加载。
于是,只好舍弃这种方式,另辟蹊径了。
1. 创建MyApplicationContextInitializer类
实现ApplicationContextInitializer接口,创建MyApplicationContextInitializer类,重写initialize方法。
public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
try {
ConfigurableEnvironment environment = applicationContext.getEnvironment();
// 配置中心密码解密
String nacosConfigPwd = environment.getProperty("spring.clond.nacos.config.password");
if (StringUtils.hasText(nacosConfigPwd)) {
String newNacosConfigPwd = DecryptUtils.decrypt(nacosConfigPwd);
Properties properties = new Properties();
properties.put("spring.clond.nacos.config.password", newNacosConfigPwd);
environment.getPropertySources().addFirst(new PropertiesPropertySource("nacos-config-decryed", properties));
}
// 注册中心密码解密
String nacosDiscoveryPwd = environment.getProperty("spring.clond.nacos.password");
if (StringUtils.hasText(nacosDiscoveryPwd)) {
String newNacosDiscoveryPwd = DecryptUtils.decrypt(nacosDiscoveryPwd);
Properties properties = new Properties();
properties.put("spring.clond.nacos.password", newNacosDiscoveryPwd);
environment.getPropertySources().addFirst(new PropertiesPropertySource("nacos-discovery-decryed", properties));
}
// 数据源密码解密
String datasourcePwd = environment.getProperty("spring.datasource.password");
if (StringUtils.hasText(datasourcePwd)) {
String newDatasourcePwd = DecryptUtils.decrypt(datasourcePwd);
Properties properties = new Properties();
properties.put("spring.datasource.password", newDatasourcePwd);
environment.getPropertySources().addFirst(new PropertiesPropertySource("datasource-decryed", properties));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这种方式支持任何一种配置的密码的解密。
2. 配置spring.factories
在resources下的META-INF目录中配置spring.factories文件
org.springframework.context.ApplicationContextInitializer=xxx.MyApplicationContextInitializer
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)