如何在springboot启动过程中自动解密配置文件中的加密部分
废话不多说直接上代码
首先我们需要搭建一个简单的springboot项目
启动类
package com.luojie;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Applications {
public static void main(String[] args) {
SpringApplication.run(Applications.class, args);
}
}
一个简单的controller
package com.luojie.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Value("${test.a.value}")
private String a;
@Value("${test.b.value}")
private String b;
@Value("${test.c.value}")
private String c;
@GetMapping("/test/geta")
public void test1() {
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
配置文件
test.a.value={decrypt}MTIzNDU2Nzg=
test.b.value={decrypt}YWJjZGVmZw==
test.c.value=123
pre.fix={decrypt}
然后就是我们的解密工具类
package com.luojie.postprocessor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.boot.env.OriginTrackedMapPropertySource;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DecryptEnvironmentPostProcessor implements EnvironmentPostProcessor {
// 可只对需要解密的配置进行解密
private String pre;
/**
* 对全部配置文件进行加解密
*
* @param environment
* @param application
*/
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Map<String, Object> decryptedProperties = new HashMap<>();
pre = environment.getProperty("pre.fix");
environment.getPropertySources().forEach(propertySource -> {
if (propertySource instanceof OriginTrackedMapPropertySource) {
OriginTrackedMapPropertySource source = (OriginTrackedMapPropertySource) propertySource;
source.getSource().forEach((key, value) -> {
String strV = String.valueOf(value);
if ((strV.startsWith(pre) && strV.length() > pre.length())) {
String decryptedValue = decrypt(strV);
decryptedProperties.put(key, decryptedValue);
} else {
decryptedProperties.put(key, value);
}
});
// 去掉原来的property
environment.getPropertySources().remove(propertySource.getName());
// 增加为新的property
environment.getPropertySources().addLast(new OriginTrackedMapPropertySource(propertySource.getName(), decryptedProperties));
}
});
}
private String decrypt(String encryptedValue) {
// 还原本来应该的属性值
encryptedValue = encryptedValue.substring(pre.length());
// 在这里编写你的解密逻辑,这里假设是简单的Base64解码
return new String(Base64.getDecoder().decode(encryptedValue));
}
}
同时需要在META-INF文件夹下创建spring.factories
org.springframework.boot.env.EnvironmentPostProcessor=com.luojie.postprocessor.DecryptEnvironmentPostProcessor
EnvironmentPostProcessor
接口是Spring Boot提供的一个用于在Spring应用程序启动过程中对Environment
进行后处理的扩展点。它允许你在Spring Boot应用程序启动时修改或增强Environment
的属性。
Environment
代表了Spring应用程序的环境,包括了所有配置属性,如配置文件、系统属性等。EnvironmentPostProcessor
接口允许你在Environment
加载完成后,但在ApplicationContext
创建之前,对环境属性进行修改。
通常,我们可以使用EnvironmentPostProcessor
来做一些特定的环境配置,例如:
- 从外部配置中心加载配置属性。
- 对配置属性进行加密或解密。
- 动态地添加或修改配置属性。
然后我们来看看效果,访问controller试试。已经完成解密
ok,已经成功,希望对各位大佬有帮助。麻烦加个关注点个赞谢谢。