2015-04-29 15 views
6

Spring Boot 1.2.3 kullanıyorum ve @ConfigurationProperties ile açıklamalı bir fasulye içine enjekte edilmeden önce bir özellik değerinin şifresini çözmek mümkün olup olmadığını anlamak istiyorum.@ConfigurationProperties beans'de kullanılan özellikleri nasıl çözebilirim?

varsayalım Bir application.properties dosyasında aşağıdaki vardır:

appprops.encryptedProperty=ENC(ENCRYPTEDVALUE)

ve örnek uygulama şöyle: Bunu başarmak için özel bir PropertySourcesPlaceholderConfigurer kullandım Geçmişte

package aaa.bb.ccc.propertyresearch; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.boot.context.properties.EnableConfigurationProperties; 

import javax.annotation.PostConstruct; 

@SpringBootApplication 
@EnableConfigurationProperties(PropertyResearchApplication.ApplicationProperties.class) 
public class PropertyResearchApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(PropertyResearchApplication.class, args); 
    } 

    @ConfigurationProperties("appprops") 
    public static class ApplicationProperties { 
     private String encryptedProperty; 

     @PostConstruct 
     public void postConstruct() throws Exception { 
      System.out.println("ApplicationProperties --> appprops.encryptedProperty = " + encryptedProperty); 
     } 

     public String getEncryptedProperty() { 
      return encryptedProperty; 
     } 

     public void setEncryptedProperty(String encryptedProperty) { 
      this.encryptedProperty = encryptedProperty; 
     } 
    } 
} 

ancak aşağıdaki gibi bir yapının kurulmasını gerektirir:

Bu ve kendi başına kötü değil iken ben şifreli özellikleri ile @ConfigurationProperties niceleri kaldırabilir görmek istiyorum.

+2

bunu gördün mü: /: http://stackoverflow.com/questions/24451110/creating-a-custom-jasypt-propertysource-in-springboot – koe

+0

OP http cevabını buldu /stackoverflow.com/a/24486190/4094797. Lütfen çözümü bulmak için bağlantıyı kontrol edin. – user2339071

cevap

0

org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer 'dan Bahar İlkesi xml dosyasında aşağıdaki Bahar yapılandırmasını ekleyebilirsiniz.

<context:property-placeholder location="classpath:application.properties"/> 


<bean class="org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer"> 
     <constructor-arg ref="configurationEncryptor" /> 
     <property name="location" value="classpath:application.properties" /> 
    </bean> 
    <bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor"> 
     <property name="algorithm" value="PBEWithMD5AndDES" /> 
     <property name="password" value="password" /> 
    </bean> 
0

Sadece aşağıdaki dosyayı bahar projenize bırakın ve özel şifre çözme yöntemini uygulayın.

@Component 
public class CmtEncryptedPropertyConfigurer extends PropertySourcesPlaceholderConfigurer { 

private ConfigurableEnvironment environment; 

@Override 
public void setEnvironment(Environment environment) { 
    super.setEnvironment(environment); 
    this.environment = (ConfigurableEnvironment) environment; 
} 
@Override 
protected void loadProperties(Properties props) throws IOException { 
    this.localOverride = true; 
    for (PropertySource<?> propertySource : environment.getPropertySources()) { 
     if (propertySource instanceof EnumerablePropertySource) { 
      String[] propertyNames = ((EnumerablePropertySource) propertySource).getPropertyNames(); 
      for (String propertyName : propertyNames) { 
       String propertyValue = propertySource.getProperty(propertyName).toString(); 
       // put logic to see if decryption required for thsi name/value 
       // decrypt here 
       String decryptedValue = decrypt(propertyValue); 
       // set value here 
       props.setProperty(propertyName, decryptedValue); 
      } 
     } 
    } 
}} 
0

PropertyResourceConfigurer bu amaçla geçersiz bir convertPropertyValue yöntemi vardır.

https://docs.spring.io/autorepo/docs/spring/4.1.6.RELEASE/javadoc-api/org/springframework/beans/factory/config/PropertyResourceConfigurer.html#convertPropertyValue-java.lang.String-

public class EncryptedPropertySourcedPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer { 

    @Override 
    protected String convertPropertyValue(String originalValue) { 
    if(originalValue.startswith("ENC") { 
     return decrypt(originalValue.subString(4, originalValue.length() - 1); 
    } 
    return originalValue; 
    } 
} 
İlgili konular