Есть ли способ повысить только контекст безопасности в тестах Spring Boot?
Я хочу написать какой-то модульный тест, который зависит от Spring Security.
Например, у меня есть некоторый сервисный метод, который использует некоторый репозиторий и помечен аннотацией @PreAuthorize. Репозиторий Я могу издеваться над Mockito, нет проблем. Также я могу смоделировать контекст безопасности с помощью аннотации @WithSecurity Context. Но когда я запускаю тест, аннотация @PreAuthorize просто игнорируется. Конечно, я могу запустить этот тест с аннотацией @SpringBootTest в качестве интеграционного теста, и в этом случае контекст безопасности работает, но этот путь тяжелый и медленный.
Есть ли способ запустить модульное тестирование только с поднятым Spring Security Context?
ОБНОВИТЬ
Сделал пример такого рода теста. Спасибо @Sam Brannen за правильное направление.
@ActiveProfiles("method-security-test")
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ExampleService.class, ExampleServiceTest.MethodSecurityConfiguration.class})
public class ExampleServiceTest {
private ExampleService service;
@Autowired
public void setService(ExampleService service) {
this.service = service;
}
@Test
@WithMockUser(username = "john_doe")
public void testAuthenticated() {
String actualMessage = service.example();
Assert.assertEquals("Message of john_doe", actualMessage);
}
@Test(expected = AuthenticationException.class)
public void testNotAuthenticated() {
service.example();
Assert.fail();
}
@TestConfiguration
@EnableGlobalMethodSecurity(prePostEnabled = true)
static class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
}
}
@Service
class ExampleService {
@PreAuthorize("isAuthenticated()")
String example() {
Principal principal = SecurityContextHolder.getContext().getAuthentication();
return "Message of " + principal.getName();
}
1 ответ
@PreAuthorize
аннотация Spring Security будет принята только в том случае, если Spring Security проксирует ваш компонент (например, служебный компонент).
Простейший способ сделать это - аннотировать @Configuration
класс с @EnableGlobalMethodSecurity(prePostEnabled = true)
Если ваш компонент зарегистрирован как компонент (например, через компонентное сканирование или @Bean
метод), и в том числе ваш AuthenticationManager
настроить.
Затем вы можете создать целенаправленный интеграционный тест, используя @ContextConfiguration
(без поддержки тестирования Spring Boot), чтобы загрузить ApplicationContext
от твоего @Configuration
учебный класс. И вы можете использовать @Autowired
чтобы получить доступ к вашему прокси-компоненту, который будет @PreAuthorize
поддержка проверки безопасности.
Вы можете найти этот старый пост в блоге полезным и для справочной информации: https://spring.io/blog/2013/07/04/spring-security-java-config-preview-method-security/