中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

springboot~繼(ji)承EnvironmentPostProcessor實現對敏感配置的處理

配置文件中的敏感信息,如密碼,賬號這些都應該是秘文的,在程序獲取時,再將它們動態解密,這樣保證了配置信息的安全;在springboot中,有個resources\META-INF\spring.factories文件,他幫(bang)我們(men)完成了自(zi)動(dong)裝配,開發過starter包的(de)同學應(ying)該不會陌(mo)生,而(er)在(zai)這個(ge)文件里,我們(men)也可以添(tian)加自(zi)定義的(de)環境(jing)攔截器,對(dui)環境(jing)變量,配置信息等(deng)進行處理。

執行時機

EnvironmentPostProcessor 的(de)實(shi)現類在(zai) Spring Boot 應用程序(xu)啟動過程中(zhong)的(de)早期階段(duan)被加載和執行(xing)。具體來說,它(ta)們在(zai) Spring Boot 的(de)應用程序(xu)上下文創建之前執行(xing)。

加載 EnvironmentPostProcessor 的(de)實(shi)現類的(de)過程如(ru)下:

  1. Spring Boot 應用程序啟動時,首先會加載并創建一個初始的環境(ConfigurableEnvironment)。

  2. 在初始化環境后,Spring Boot 會掃描 classpath 中的 META-INF/spring.factories 文件,以查找并加載配置在其中的 EnvironmentPostProcessor 實現類。

  3. 一(yi)旦(dan)找到這(zhe)些實(shi)現(xian)類,它們將被實(shi)例化(hua)和執行。在(zai)這(zhe)個階段,你(ni)可以(yi)在(zai)應用程序環境加載之前進行一(yi)些自定(ding)義的配(pei)置或(huo)修改。

這使得 EnvironmentPostProcessor 成為(wei)一個(ge)非(fei)常早(zao)期的擴展(zhan)點,允許你(ni)在應(ying)用(yong)程(cheng)序環境初始化之(zhi)前介入(ru),并根據需要修(xiu)改屬性源、配(pei)置(zhi)屬性等。這對于在應(ying)用(yong)程(cheng)序啟(qi)動時執行高(gao)級(ji)的自定義配(pei)置(zhi)非(fei)常有用(yong)。

starter中的注冊

spring.factories 是 Spring Boot 中的一個特殊配置文件,用于自動裝配(auto-configuration)和其他 Spring Boot 特性的配置。在 spring.factories 文件中,你可以指定各種 Spring Boot 自動配置和其他擴展的類,包括 EnvironmentPostProcessor

EnvironmentPostProcessor 是 Spring Boot 的一個擴展點,用于在 Spring 應用程序的環境(Environment)加載之后進行額外的自定義配置。具體來說,EnvironmentPostProcessor 允許你在 Spring Boot 應用(yong)程(cheng)序(xu)啟動時修改環境屬性,這對(dui)于(yu)一些(xie)高級配置需求非常有用(yong)。

通過在 spring.factories 中配置 EnvironmentPostProcessor,你可(ke)以實現一些高級的(de)環境配置,例如根(gen)據特定條(tiao)件動(dong)(dong)態修改屬性(xing)值,或者加(jia)載外部配置源。這為應(ying)用(yong)程序提供了更大的(de)靈活性(xing),允(yun)許(xu)你在應(ying)用(yong)程序啟動(dong)(dong)之前對環境進(jin)行精細(xi)的(de)調整。

# Auto Configure
org.springframework.boot.env.EnvironmentPostProcessor=\
  com.lind.common.env.MpwEnvironmentPostProcessor

自定義EnvironmentPostProcessor類,對敏感字符進行解密

/**
 * 處理配置中的敏感信息,讀配置時完成解密操作.
 *
 * @author lind
 * @date 2023/10/9 8:33
 * @since 1.0.0
 */
public class EnvironmentPostProcessorDemo implements EnvironmentPostProcessor {

	static final String MPW = "mpw.key";
	static Logger logger = LoggerFactory.getLogger(EnvironmentPostProcessorDemo.class);

	public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
		String mpwKey = null;
		for (PropertySource<?> ps : (Iterable<PropertySource<?>>) environment.getPropertySources()) {
			if (ps instanceof SimpleCommandLinePropertySource) { // jvm啟動時命令行參數
				SimpleCommandLinePropertySource source = (SimpleCommandLinePropertySource) ps;
				mpwKey = source.getProperty(MPW);
				break;
			}
			if (ps instanceof OriginTrackedMapPropertySource) {// application.yml
				OriginTrackedMapPropertySource source = (OriginTrackedMapPropertySource) ps;
				if (source.containsProperty(MPW))
					mpwKey = source.getProperty(MPW).toString();
				break;
			}
		}

		if (StringUtils.isNotBlank(mpwKey)) {
			HashMap<String, Object> map = new HashMap<>();
			for (PropertySource<?> ps : (Iterable<PropertySource<?>>) environment.getPropertySources()) {
				if (ps instanceof OriginTrackedMapPropertySource) {
					OriginTrackedMapPropertySource source = (OriginTrackedMapPropertySource) ps;
					for (String name : source.getPropertyNames()) {
						Object value = source.getProperty(name);
						if (value instanceof String) {
							String str = (String) value;
							if (str.startsWith("mpw:")) {
								String decrypt = AESNetUtils.decrypt(str.substring(4), mpwKey);
								map.put(name,decrypt );

							}
						}
					}
				}
			}

			if (MapUtils.isNotEmpty(map))
				environment.getPropertySources()
						.addFirst((PropertySource) new MapPropertySource("custom-encrypt", map));
		}
	}

}

使用

  • application.yml
mpw:
  key: lind123456123456

author:
  name: mpw:vpTzfVrH5eEbsFmSJO9bSw==
  nationality: mpw:vFLIjoQXy4Pzo1/hOm8hWw==
  • 單元測試代碼

@Test
public void mpwTest() {
	// AESNetUtils.encrypt("中國人", "lind123456123456");//vFLIjoQXy4Pzo1/hOm8hWw==
	System.out.println(SpringContextUtils.getEnvironment().getProperty("author.name"));
	System.out.println(SpringContextUtils.getEnvironment().getProperty("author.nationality"));
}
	
  • 測試結果
posted @ 2023-10-09 10:38  張占嶺  閱讀(848)  評論(0)    收藏  舉報