Spring属性占位符解密已解析的属性

时间:2014-02-27 18:27:37

标签: java spring

我正在寻找是否有一种方法可以拦截属性占位符机制,这样如果我有一个已解析的属性值以某种方式标记为加密,我可以解密并使用结果作为已解决值。

Jasypt支持这样的事情但实际上在尝试装饰bean之前解密所有属性值。

有什么想法或想法吗?

我有自己的解密机制,并将值字符串标记为加密,并使用{AES}作为编码值的前缀。

编辑正如我上面提到的关于Jasypt实现的那样,以同样的方式拦截会让我得到正确的解密,我已经开始工作了。我担心的是 - 在占位符配置器使用结束后,属性集合保留在内存中多久或者它们是否会消失?

1 个答案:

答案 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的属性,并将被处理。