我有一个场景,我从属性文件中获取编码密码值。我有自己的解密实现,所以想要从我的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})"
>
基本上,在用于建立数据库连接之前,我需要解密从属性文件中获取的密码。
感谢您的时间和任何帮助!!
答案 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
}
`