2015-04-29 17 views
6

Używam Spring Boot 1.2.3 i chciałbym zrozumieć, czy możliwe jest odszyfrowanie wartości właściwości przed jej wstrzyknięciem do fasoli opatrzonej komentarzem @ConfigurationProperties.Jak odszyfrować właściwości używane w komponentach @ConfigurationProperties?

Załóżmy, że mam następujących w pliku application.properties:

appprops.encryptedProperty=ENC(ENCRYPTEDVALUE)

i przykładowej aplikacji tak:

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; 
     } 
    } 
} 

W przeszłości używałem zwyczaj PropertySourcesPlaceholderConfigurer do osiągnięcia tego celu ale wymaga to ustawienia następującej struktury:

@Component 
public class ApplicationProperties { 
    @Value("${appprops.enrcyptedProperty}") 
    private String encryptedProperty; 

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

    public String getEncryptedProperty() { 
     return encryptedProperty; 
    } 
} 

Chociaż to samo w sobie nie jest złe, chciałbym sprawdzić, czy mogę wykorzystać subtelności z @ConfigurationProperties z zaszyfrowanymi właściwościami.

+2

Widzieliście to: http://stackoverflow.com/questions/24451110/creating-a-custom-jasypt-propertysource-in-springboot – koe

+0

OP znaleźć odpowiedź na http://stackoverflow.com/a/24486190/4094797. Prosimy o sprawdzenie linku, aby znaleźć rozwiązanie. – user2339071

Odpowiedz

0

można użyć org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer można dodać po konfiguracji Spring w pliku xml kontekst wiosny.

<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

Po prostu upuść poniższy plik w swoim projekcie wiosennym i zaimplementuj niestandardową metodę odszyfrowywania.

@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 ma metodę convertPropertyValue, którą można przesłonić w tym celu.

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; 
    } 
}