我正在寻找是否有一种方法可以拦截属性占位符机制,这样如果我有一个已解析的属性值以某种方式标记为加密,我可以解密并使用结果作为已解决值。
Jasypt支持这样的事情但实际上在尝试装饰bean之前解密所有属性值。
有什么想法或想法吗?
我有自己的解密机制,并将值字符串标记为加密,并使用{AES}作为编码值的前缀。
编辑正如我上面提到的关于Jasypt实现的那样,以同样的方式拦截会让我得到正确的解密,我已经开始工作了。我担心的是 - 在占位符配置器使用结束后,属性集合保留在内存中多久或者它们是否会消失?
答案 0 :(得分:6)
您可以展开PropertyPlaceholderConfigurer
并覆盖org.springframework.beans.factory.config.PropertyResourceConfigurer.convertPropertyValue(String)
方法,如果它以"{EAS}"
开头,则会对其进行解密。类似下面的类可以用作PropertyPlaceHolder
:
package foo.bar;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
public class EncryptationAwarePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer{
@Override
protected String convertPropertyValue(String originalValue) {
if (originalValue.startsWith("{AES}")) {
return decrypt(originalValue.substring(5));
}
return originalValue;
}
private String decrypt(String value) {
return value.toLowerCase(); // here your decryption logic
}
}
您的上下文将PropertyPlaceholder
声明为:
<bean class="foo.bar.EncryptationAwarePropertyPlaceholderConfigurer">
<property name="location">
<value>my.properties</value>
</property>
</bean>
您可以轻松使用该属性:
@Value("${encryptedMyProtectedValue}")
private String decryptedValue;
编辑:org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(ConfigurableListableBeanFactory)
基本上会加载属性(到本地属性对象),转换并处理它们。通过调用org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(ConfigurableListableBeanFactory, Properties)
进行处理。在处理bean之后,使用org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
Properties
对象将不会保留在内存中。它基本上只用于在您的上下文中设置bean的属性,并将被处理。