数据源密码解密

数据源依赖

<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
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐