2013-10-09 98 views
1

我試圖讓jasypt解密(以前加密的)屬性值,最終將用於登錄到數據庫。解密工作正常,除了我介紹Maven配置文件時。我有一個本地的/ dev/prod屬性文件,這是特定於環境的。Jasypt加密不與Maven配置文件配合使用

這是我的spring3配置的相關部分。這是代碼示例中最關鍵的部分:這是推動如何設置解密以及將解密字符串設置爲示例虛擬bean的方式。

<bean id="jvmVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentPBEConfig" 
     p:password="secret_password_here"/> 

    <bean id="jvmConfigurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor" 
     p:config-ref="jvmVariablesConfiguration"/> 

    <bean id="jvmPropertyConfigurer" class="org.jasypt.spring3.properties.EncryptablePropertyPlaceholderConfigurer" 
     p:locations-ref="passwordProps"> 
    <constructor-arg ref="jvmConfigurationEncryptor"/> 
    </bean> 

    <util:list id="passwordProps"> 
    <value>classpath:database.properties</value>  
    </util:list> 

    <encryption:encryptable-properties id="dbProps" encryptor="jvmConfigurationEncryptor" location="classpath:database.properties"/> 

    <bean id="dummy" class="DummyPropertyTest"> 
    <property name="prop" value="${database.bar}"/> 
    </bean> 

在我的一個maven poms中,這裏是我指定配置文件的地方。

... 

    <profiles> 
    <profile> 
     <id>local</id> 
     <properties> 
     <build.profile.id>local</build.profile.id> 
     </properties> 
     <build> 
     <filters> 
      <filter>src/main/resources/properties/${build.profile.id}/database.properties</filter> 
     </filters> 
     <resources> 
      <resource> 
      <filtering>true</filtering> 
      <directory>src/main/resources</directory> 
      <includes> 
       <include>**/*.properties</include> 
       <include>**/*.xml</include> 
      </includes> 
      </resource> 
     </resources> 
     </build> 
    </profile> 

    <!--dev and prod profiles follow this in a similar pattern --> 

.... 

我使用jasypt 1.9.1版本:

<dependency> 
    <groupId>org.jasypt</groupId> 
    <artifactId>jasypt-spring3</artifactId> 
    <version>1.9.1</version> 
</dependency> 

我有一個主數據庫屬性文件(database.properties)安裝在/ src目錄/主/資源,它具有這些特性的佔位符:

database.url=${database.url} 
database.username=${database.username} 
database.password=${database.password} 
database.dialect=${database.dialect} 
database.driver=${database.driver} 
database.show_sql=${database.show_sql} 
database.bar=${database.bar} 

然後這裏是我的本地屬性文件,位於/src/main/resources/properties/local/database.properties:

database.url=jdbc:hsqldb:hsql://localhost/db 
database.username=sa 
database.password= 
database.dialect=MyHSQLDialect 
database.driver=org.hsqldb.jdbcDriver 
database.show_sql=true 
database.bar=ENC(RSuprdBgcpdheiWX0hJ45Q==) 

這裏是我的樣本spring bean代碼,只是讀取它設置的屬性。如果一切正常,該值將被打印到stdout解密。

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class DummyPropertyTest { 

    private String prop; 

    public String getProp() { 
     return prop; 
    } 

    public void setProp(String prop) { 
     this.prop = prop; 
    } 

    @Value("#{dbProps['database.bar']}") 
    public String otherProp; 

    public String getOtherProp() { 
     return otherProp; 
    } 

    public static void main(String[] args) { 
     ApplicationContext ctx = new ClassPathXmlApplicationContext("/META-INF/spring/applicationContext-common.xml"); 
     DummyPropertyTest dpt = (DummyPropertyTest) ctx.getBean("dummy"); 

     System.out.println("what's my property being set??: "+dpt.getProp()); 
     System.out.println("otherProp:"+dpt.getOtherProp()); 
    } 
} 

如果我調整我的春天配置駐留在通常只包含了每個屬性的環境重寫只是佔位符的主屬性文件的屬性來讀取,然後解密工作。但解密不起作用試圖從本地屬性文件讀取加密的屬性。我試圖調整彈簧配置,希望這可能只是一個類路徑問題,但這似乎也沒有幫助。

我是否需要重寫Spring如何查看屬性前綴和後綴,如果僅用於可能需要加密的屬性? (如果我這樣做,那麼這似乎適用於所有屬性,而不僅僅是可加密屬性,因爲Jasypt的EncryptablePropertyPlaceholderConfigurer是Spring的PropertyPlaceholderConfigurer的替代替代品)。

這裏是程序的輸出,如果我有兩個屬性文件設置爲我說明: what's my property being set??: ENC(RSuprdBgcpdheiWX0hJ45Q==)

這裏是程序的輸出,如果我有主屬性文件包含加密屬性: what's my property being set??: sa

我不確定問題是Spring還是Jayspt。我不認爲這是Maven。如果可能的話,我寧願不放棄現在的Maven配置文件。

爲清晰起見,運行時示例進行了編輯。

* 更新 *:我可以確認,如果我使用Jasypt Spring配置方式 <encryption:encryptable-properties id="dbProps" encryptor="jvmConfigurationEncryptor" location="classpath:database.properties"/>

然後在我的測試豆我可以連線了一個成員有值正確解密分配給它的財產:

@Value("#{dbProps['database.bar']}") 
    public String otherProp; 

這似乎工作。但我真的需要PropertyOverride的東西來工作,以便我可以正確地獲取數據庫配置。

回答

0

我在一位同事的幫助下找到了解決方案。問題確實是配置文件的maven過濾。這是更正的配置文件設置。之後,解密就像夢一樣。因此,不需要將@Value註釋直接分別連接到bean中:直接從Spring配置設置屬性就能正常工作。

<profile> 
    <id>local</id> 
    <properties> 
    <build.profile.id>local</build.profile.id> 
    </properties> 
    <build> 
    <filters> 
     <filter>src/main/resources/properties/${build.profile.id}/database.properties</filter> 
     <filter>src/main/resources/properties/${build.profile.id}/cli.properties</filter> 
    </filters> 
    <resources> 
     <resource> 
     <filtering>true</filtering> 
     <directory>src/main/resources</directory> 
     <includes> 
      <include>**/*.properties</include> 
     </includes> 
     <excludes> 
      <exclude>**/*.xml</exclude> 
      <exclude>**/local/*.properties</exclude> 
      <exclude>**/dev/*.properties</exclude> 
      <exclude>**/prod/*.properties</exclude> 
     </excludes> 
     </resource> 
     <resource> 
     <filtering>false</filtering> 
     <directory>src/main/resources</directory> 
     <includes> 
      <include>**/*.xml</include> 
     </includes> 
     </resource> 
    </resources> 
    </build> 
</profile>