今天在做一个Appllo动态加解密的功能,需要修改Apollo-client的源码。
目前源码修改是正常的,在项目启动时也能调用到Apollo的DefaultConfig的函数,就是在初始化解密的时候有点,小问题:
访问不到本地的配置文件,显示‘null’
上源码及相关代码:
/**
* @author Jason Song(song_s@ctrip.com)
*/
@Component
public class DefaultConfig extends AbstractConfig implements RepositoryChangeListener {
private static final Logger logger = LoggerFactory.getLogger(DefaultConfig.class);
private final String m_namespace;
private final Properties m_resourceProperties;
private final AtomicReference<Properties> m_configProperties;
private final ConfigRepository m_configRepository;
private final RateLimiter m_warnLogRateLimiter;
private volatile ConfigSourceType m_sourceType = ConfigSourceType.NONE;
@Value("${jasypt.encryptor.password}")
private String DECRYPT_KEY;
最下面的是AES解密用的Key
这是配置更新和初始化会用到的函数,是我更改后的
private void updateConfig(Properties newConfigProperties, ConfigSourceType sourceType) {
Set<Object> keys = newConfigProperties.keySet();
for (Object k : keys) {
String key = k.toString();
String value = newConfigProperties.getProperty(key);
// 加密Value
if (value.startsWith("ENC(") && value.endsWith(")")) {
logger.info("加密Value {}", value);
// 解密然后重新赋值
try {
//String decryptValue = AesEncryptUtils.aesDecrypt(value.substring(3, value.length()-1), DECRYPT_KEY);
String decryptValue = AESUtil.decrypt(value.substring(3, value.length()-1), DECRYPT_KEY);
newConfigProperties.setProperty(key, decryptValue);
} catch (Exception e) {
logger.error("加密配置解密失败", e);
}
}
}
m_configProperties.set(newConfigProperties);
m_sourceType = sourceType;
}
DECRYPT_KEY
读取是空(null)
启动类的ComponentScan
已配置
配置文件
server.port=XXX
app.id=XXX
apollo.meta=http://XXX
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application
jasypt.encryptor.password=somepwd
目前还在排查中,
猜想是Apollo的配置中心文件覆盖了本地的配配置文件,因为在console中Apollo的配置加载是最先的,然后namespace与本地文件的相同,所以导致了覆盖(猜)
又或者简单一点的,是我@Value
的用法有问题。
还请有经验的老哥指点一二