#java #spring #spring-boot #junit #jasypt
#java #spring #spring-boot #junit #jasypt
Вопрос:
У меня есть приложение Spring Boot с несколькими свойствами, зашифрованными с помощью Jasypt, и я предоставляю секретный ключ со следующей опцией виртуальной машины: -Djasypt.encryptor.password=secretkey
Все работает отлично, когда я запускаю свое приложение локально и в рабочей среде. Проблема в том, что я не уверен, что мне нужно сделать, чтобы расшифровать свойства, которые я зашифровал в своем файле application-test.properties, который я использую во время тестов JUnit. Я даже передаю ту же опцию виртуальной машины, что и выше, в свой тест JUnit.
Я не получаю никаких исключений во время тестирования JUnit, которые объясняли бы мне, почему я не могу расшифровать, но свойства, которые мне нужны для расшифровки, просто не расшифровываются. Возможно ли это вообще или есть какая-то конфигурация, с помощью которой я могу настроить свои тесты для использования дешифрования Jasypt.
Я включу приведенный ниже код. Тест, который я выполняю, в частности, для метода JavaMailService. У меня есть пароль, зашифрованный в application-test.properties, и тест завершается неудачно, поскольку он не может аутентифицировать пользователя (поскольку пароль все еще зашифрован)
application-test.properties:
spring.mail.password=ENC(1NrovUC7 YAzVNhbbpHkRi9TghEPys0aQk1nXonk354=)
Основной тестовый класс:
@RunWith(SpringRunner.class)
@WebMvcTest(value = { ApiController.class, RestController.class })
@ContextConfiguration(classes = { MyApplication.class, EmailService.class, EmailServiceTestConfig.class })
@ActiveProfiles("test")
class MyApplicationTests {
@Autowired
private MockMvc mockMvc;
@Test
public void testSendEmail() throws Exception {
...
}
}
Класс EmailServiceTestConfig:
@SpringBootConfiguration
public class EmailServiceTestConfig {
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
@Bean
public JavaMailSender javaMailService() {
...
}
private Properties getMailProperties() {
...
}
}
Я пропустил некоторую неважную информацию, однако из этого класса EmailServiceTestConfig я проверил пароль, полученный из файла свойств, и он не был расшифрован. Любые идеи, пожалуйста, дайте мне знать! Если я найду решение, я также опубликую здесь. Любая дополнительная информация, которая вам может понадобиться, пожалуйста, дайте мне знать!
Комментарии:
1. Не использовал jasypt, но, похоже, вам нужно активировать компоненты jasypt в вашем приложении. Хотя этот jasypt spring2 относится к Spring 2, вы можете найти некоторую полезную информацию о том, как активировать их в вашем приложении.
2. Вы нашли решение для этого? У меня та же проблема
Ответ №1:
У меня была та же проблема, с которой я аннотировал тестовый класс @Import(EnableEncryptablePropertiesConfiguration.class)
.
Да, с ним все работало нормально @SpringBootTest
, но загрузка всего приложения занимала так много времени.
Ответ №2:
Решаемая проблема. Мне нужно было аннотировать тестовый класс моего приложения с помощью @SpringBootTest . Как только я это сделал, пароль был расшифрован. Не уверен на 100%, как и почему, но я считаю, что аннотация SpringBootTest была необходима для подключения Jasypt к среде Spring Boot во время выполнения тестов.
Комментарии:
1. Тоже не работает
Ответ №3:
У меня была аналогичная проблема с аннотированными тестами @SpringBootTest. Когда приложение запускается с помощью теста, оно пытается расшифровать пароли из файлов свойств. Поскольку я не хочу ни помещать секрет в файл application-test.properties, ни запускать тесты каждый раз с секретом вручную, контекст приложения не удалось загрузить, и тесты завершились неудачно. Но я нашел следующее обходное решение.
jasypt.encryptor.property.prefix=[[[[[
jasypt.encryptor.property.suffix=]]]]]
Я поместил их в свое приложение-test.properties.
Таким образом, jasypt не видит мои пароли в свойствах как зашифрованные, поскольку я перезаписываю стандартный суффикс ENC(префикс и ).
Теперь все мои тесты выполняются. И поскольку мне не нужны расшифрованные пароли в моих тестах, все работает.
Не имеет значения, что вы вводите в качестве префикса или суффикса, это просто не должно быть началом свойства в ваших файлах, поэтому jasypt пытается расшифровать что-то еще.