java spring - 覆盖从属性文件

时间:2016-02-05 18:50:32

标签: java spring encryption properties

我有一个场景,我从属性文件中获取编码密码值。我有自己的解密实现,所以想要从我的java类解密密码,然后想要进一步使用那个解密的值,在那里引用它。

例如,

<bean id="myDataSource" class="org.apache.common.dbcp.BasicDataSource" ... // more attributed set from properties like user, hostname etc. p:password="${myPropertey.password}" >

上面的代码我需要实现类似下面的内容,具体到密码属性,因为其他属性很好,但密码需要在使用之前解密。

(以下实施是错误的,但我刚才提到了更多更明确的想法)

<bean id="myDataSource" class="org.apache.common.dbcp.BasicDataSource" ... // more properties p:password="myDecryptBean.decryptMyPassword(${myPropertey.password})" >

基本上,在用于建立数据库连接之前,我需要解密从属性文件中获取的密码。

感谢您的时间和任何帮助!!

3 个答案:

答案 0 :(得分:1)

您需要创建一个解密密码的自定义数据源对象

<bean id="myDataSource" class="foo.bar.PasswordDecryptingDataSource"
... // more properties
p:encryptedPassword="${myPropertey.password}"
>

像这样实施foo.bar.PasswordDecryptingDataSource

public class PasswordDecryptingDataSource extends org.apache.common.dbcp.BasicDataSource {
    private myDecryptBean; // inject your decryption bean somehow...

    public void setEncryptedPassword(String password) {
        super.setPassword(myDecryptBean.decryptMyPassword(password))
    }
}

答案 1 :(得分:1)

由于您使用Spring,我强烈建议您查看PropertyResourceConfigurer课程。 请参阅Official Documentation

特别要看一下convertProperty(String propertyName, String propertyValue)方法,并考虑创建一个覆盖它的类。然后,您将能够将自定义解密逻辑添加到overriden方法,该方法将在每次Spring访问该属性时运行。

直接来自文档:

  

允许从属性资源(即属性文件)配置各个bean属性值。对自定义配置文件有用...覆盖在应用程序上下文中配置的bean属性。

答案 2 :(得分:1)

Brian,Samuel

非常感谢您的快速帮助,这两种方法都为我的情况提供了解决方案。

我已经实现扩展PropertyPlaceholderConfigurer,考虑将来我是否可能获得编码的更多属性,并且不想将解密逻辑限制到DataSource。

我刚刚实施的2美分代码片段,可以帮助可能会遇到类似情况的人。

<bean class="com.foo.spring.util.PropertyUtil"> <property name="location"> <value>file:${foo.config.location}</value> </property> </bean>

以下是课程

`public class PropertyUtil扩展了PropertyPlaceholderConfigurer {

@Override
public String convertProperty(String propertyName, String propertyValue){
    return super.convertProperty(propertyName, decrypt(propertyValue));
}


private String decrypt(String){
// logical implementation
}

`