Как использовать SpringBoot @ConfigurationProperties с Jasypt в свойствах, расположенных за пределами application.properties

Я использую Spring Boot 1.4.2 и использую @ConfigurationProperties для загрузки моих свойств в свой bean-компонент свойств следующим образом:

@ConfigurationProperties(prefix="my.prop", locations = "classpath:properties/myprop.properties")
@Configuration
public class MyProp {
    private String firstName;
    private String lastName;
    // getters & setters
}

Также у меня есть этот файл свойств:

my.prop.firstName=fede
my.prop.lastName=ENC(MzWi5OXKOja3DwA52Elf23xsBPr4FgMi5cEYTPkDets=)

Мой контроллер довольно прост:

@RestController
public class MyController {
    @Autowired
    private MyProp prop;

    @GetMapping("/")
    public String get() {
        System.out.println(String.format("UserConfig - user: %s, lastName: %s", prop.getFirstName(), prop.getLastName()));

        return "something";
    }
}

Все работает нормально, мои свойства загружены, и мой результат:

2016-11-28 14:36:30,402 INFO  9780 --- [qtp792210014-27] c.c.b.m.c.c.MyController         : [OhxxugGR] UserConfig - user: fede, lastName: ENC(MzWi5OXKOja3DwA52Elf23xsBPr4FgMi5cEYTPkDets=)

Я подтвердил, что все работает нормально, и я хотел использовать jasypt для шифрования и использования своих свойств, однако я добавил эту зависимость в pom:

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>1.9</version>
</dependency>

Но jasypt не расшифровывает, как вы можете видеть в логах. Я прочитал документацию, представленную в этом jasypt стартере, но мне все равно не повезло.

Это мой основной класс:

@SpringBootApplication
@EnableEncryptableProperties
public class ServiceBaseApplication {

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

После тестирования того, что stephane-nicoll указал в своем комментарии, кажется, что Jasypt выбирает только свойства, расположенные в application.properties, так как Могу ли я использовать jasypt со свойствами, расположенными вне этого файла?


person Federico Piazza    schedule 28.11.2016    source источник
comment
Из README кажется, что вы используете первый способ, но если вы настроили jasypt.encryptor.password, это не ответ на самом деле, но на самом деле, когда я хочу настроить локальный, но всегда получаю исключение, поскольку требуется jasypt.encryptor.password, если я установил пароль , возникнет make sure encryption/decryption passwords match исключение.   -  person Liping Huang    schedule 29.11.2016
comment
@LipingHuang да, в любом случае я должен был получить ошибку шифрования, если пароль был неправильным   -  person Federico Piazza    schedule 29.11.2016
comment
Не используйте locations, этот атрибут устарел. Возможно, jasypt расшифровывает только те свойства, которые загружаются из обычных мест. Что произойдет, если вы удалите атрибут locations и поместите эти свойства в application.properties?   -  person Stephane Nicoll    schedule 29.11.2016
comment
@StephaneNicoll, вы правы, jasypt расшифровывает свойства, расположенные в application.properties, а не те, которые загружены с location. Что мне следует использовать вместо местоположения, если я хочу иметь модульные свойства? Я переношу проект, состоящий из модулей с более чем 300 свойствами.   -  person Federico Piazza    schedule 29.11.2016


Ответы (2)


У меня была такая же проблема, когда я хранил свой зашифрованный пароль в базе данных и загружал эти данные при запуске. Но Jasypt не может его расшифровать, если он не находится в файле свойств. Я отправил тот же вопрос ребятам из Jasypt. Проверьте эту ссылку, чтобы увидеть их ответ

https://github.com/ulisesbocchio/jasypt-spring-boot/issues/31#event-752104289

В конце концов, это то, чем я закончил.

@Configuration
public class JasyptConfig {

    @Value("${jasypt.encryptor.password}")
    public String encryptDecryptKey; // This is the key I used to encrypt my password

    @Bean
    public TextEncryptor createTextDecryptor(){
        BasicTextEncryptor textDecryptor = new BasicTextEncryptor();
        textDecryptor.setPassword(encryptDecryptKey);
        return textDecryptor;
    }
}

И в моем классе, где мне нужно было расшифровать, я сделал это

@Component
public class PasswordUtil {
    private final TextEncryptor textDecryptor;

    @Autowired
    public PasswordUtil(final TextEncryptor textDecryptor) {
        this.textDecryptor = textDecryptor;
    }

    public String decrypt(String encryptedText){  // This encryptedText is the one like *ENC(....)*
        return textDecryptor.decrypt(encryptedText);
    }
}

Ваше здоровье

person pvpkiran    schedule 08.12.2016

Лучше напрямую ввести EncryptablePropertyResolver и разрешить зашифрованный ключ в установщике @Value:

@Autowired
private EncryptablePropertyResolver resolver;

private String yourExternalProperty;

@Value("${your.external.property}")
public void setYourExternalProperty(String value) {
        this.yourExternalProperty = resolver.resolvePropertyValue(value);
}

Хотя я был бы счастлив, если бы кто-нибудь придумал более общее решение ...

person membersound    schedule 25.09.2018