An example how secured-properties can be used with Spring-Boot.
Spring-Boot has a nice clear definition how an application should be configured.
typically configurations are place in file:./application.properties or file:./config/application.properties
Limitation: Property-files in classpath cannot be modified, and YAML variants are not supported to auto-encrypt values by secured-properties for now.
It is recommended to create a simple Helper class to initial encrypt values in the propoerty files and decrypt the values on demand where you need it.
In Spring-Boot you can simpley annotate a simple POJO with @ConfigurationProperties for application-configurations
Like the following Example:
@Component @ConfigurationProperties(prefix = "your.app.props") public class SpringBootTestProperties { private String anotherSecretPassword; private String mySecretPassword; public String getAnotherSecretPassword() { return anotherSecretPassword;
The complete code is in SpringBootTestProperties.java
The Helper contains your secured-properties configuration and can be used to initial encrypt unencrypted values in the propoerty files and decrypt the values on demand where you need it.
import net.brabenetz.lib.securedproperties.SecuredProperties; import net.brabenetz.lib.securedproperties.SecuredPropertiesConfig; import java.io.File; public class SpringBootSecuredPropertiesHelper { // Here you should look if you maybe need a custom config: private static final SecuredPropertiesConfig config = new SecuredPropertiesConfig().initDefault(); // the same property files which are supported by spring-boot: private static File[] propertyFiles = new File[] {new File("./config/application.properties"), new File("./application.properties")}; public static void encryptProperties(String... keys) { SecuredProperties.encryptNonEncryptedValues(config, propertyFiles, keys); } public static String decrypt(String value) { if (SecuredProperties.isEncryptedValue(value)) { return SecuredProperties.decrypt(config, value); } return value; } }
The complete code is in SpringBootSecuredPropertiesHelper.java
A spring-Boot application has a starter-class where you can directly decrypt values in the property-files if needed before it is used by spring.
@SpringBootApplication public class SpringBootStarterApplication { public static void main(String[] args) { securePasswords(); SpringApplication.run(SpringBootStarterApplication.class, args); } private static void securePasswords() { // this will encrypt the given properties if there are not already encrypted: SpringBootSecuredPropertiesHelper.encryptProperties( "your.app.props.my-secret-password", "your.app.props.another-secret-password"); } }
The complete code is in SpringBootStarterApplication.java
Now you can decrypt the values of your Properties class whereever you need it.
@Service public class SpringBootTestService { @Autowired private SpringBootTestProperties testProperties; public void runHelloworld() { // decrypt the password as late as possible: System.out.println("MySecretPassword: " + SpringBootSecuredPropertiesHelper.decrypt(testProperties.getMySecretPassword())); } }
The complete code is in SpringBootTestService.java