2016-02-05 75 views
1

我有一個場景,其中我從屬性文件獲取編碼密碼值。我有自己的解密實現,所以想從我的java類中解密密碼,然後想要使用解密後的值進行更深入的引用。java spring - 覆蓋屬性文件中的屬性值

例如 <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})" >

基本上,我需要解密的密碼,這是我從屬性文件中獲取,它習慣之前建立數據庫連接。

感謝您的時間和任何幫助!

回答

1

由於您使用的春天,我會強烈建議考慮了PropertyResourceConfigurer類。 查看Official Documentation

特別看看convertProperty(String propertyName, String propertyValue)方法,並考慮創建一個覆蓋它的類。然後,您將能夠將自定義的解密邏輯添加到overriden方法中,每次Spring訪問該屬性時都會運行該方法。

直接從文檔:

允許單獨bean屬性值的構造從一個屬性資源,即一個屬性文件。有用的自定義配置文件...重寫應用程序上下文中配置的bean屬性。

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

布賴恩·塞繆爾

非常感謝你的快速幫助,這兩種方法提供解決方案,我的情況。

我已經實現了擴展PropertyPlaceholderConfigurer,考慮到將來還有更多的屬性,我可能會得到編碼,並且不想將解密邏輯限制爲DataSource。

只是我的2分錢的代碼片段,我已經實施,可以幫助某人,誰可能會發現類似的情況。

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

以下是

類`公共類PropertyUtil延伸PropertyPlaceholderConfigurer {

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


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

`