Автор оригинала: Chris Oberle.
Весенняя безопасность для весенних тестов интеграции загрузки
1. Введение
Возможность выполнить интеграционные тесты без необходимости автономной интеграционной среды является ценной особенностью для любого стека программного обеспечения. Бесшовная интеграция Spring Boot с Spring Security упрощает тестирование компонентов, взаимодействующих с слоем безопасности.
В этом быстром учебнике, мы будем изучать с помощью @MockMvcTest и @SpringBootTest для выполнения интеграционных тестов с поддержкой безопасности.
2. Зависимости
Давайте сначала приведем в зависимости, которые нам нужны для нашего примера:
org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.security spring-security-test test
весна-загрузка-стартер-веб- , весна-загрузка-стартер-безопасности , и весна-загрузка-стартер-тест стартеры предоставляют нам доступ к весенним MVC, Spring Security и тестовым утилитам Spring Boot.
Кроме того, мы приведем весна-безопасность-тест для того, чтобы получить доступ к @WithMockUser аннотация, которую мы будем использовать.
3. Конфигурация веб-безопасности
Наша конфигурация веб-безопасности будет простой. Только аутентифицированные пользователи смогут получить доступ к путям, которые соответствуют /частный/» . Пути, которые соответствуют /общественный/» будут доступны для любого пользователя:
@Configuration public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); auth.inMemoryAuthentication() .passwordEncoder(encoder) .withUser("spring") .password(encoder.encode("secret")) .roles("USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/private/**") .authenticated() .antMatchers("/public/**") .permitAll() .and() .httpBasic(); } }
4. Конфигурация безопасности метода
В дополнение к безопасности на основе URL-адреса, которую мы определили в нашем WebSecurityКонфигуратор, мы можем настроить безопасность на основе метода, предоставив дополнительный файл конфигурации:
@Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) public class MethodSecurityConfigurer extends GlobalMethodSecurityConfiguration { }
Эта конфигурация обеспечивает поддержку аннотаций spring Security до/после. Другие атрибуты также доступны, если требуется дополнительная поддержка. Для получения дополнительной информации о весенней безопасности метода, взгляните на нашу статью на эту тему .
5. Тестирование контроллеров с @WebMvcTest
При использовании @WebMvcTest аннотация подход с весенней безопасности, МокМвк автоматически настраивается с необходимой цепочкой фильтров для проверки конфигурации безопасности.
Потому что МокМвк настроен для нас, мы можем использовать @WithMockUser для наших тестов без какой-либо дополнительной конфигурации:
@RunWith(SpringRunner.class) @WebMvcTest(SecuredController.class) public class SecuredControllerWebMvcIntegrationTest { @Autowired private MockMvc mvc; // ... other methods @WithMockUser(value = "spring") @Test public void givenAuthRequestOnPrivateService_shouldSucceedWith200() throws Exception { mvc.perform(get("/private/hello").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); } }
Обратите внимание, что использование @WebMvcTest скажет Весенняя загрузка мгновенно только веб-слой, а не весь контекст. Из-за этого, контроллер тесты, которые используют @WebMvcTest будет работать быстрее, чем с другими .
6. Тестирование контроллеров с @SpringBootTest
При использовании @SpringBootTest аннотация для тестирования контроллеров с spring Security, необходимо явно настроить цепочку фильтров при настройке МокМвк .
Использование статического веснаБезопасность метод, предоставленный SecurityMockMvcConfigurer является предпочтительным способом сделать это:
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class SecuredControllerSpringBootIntegrationTest { @Autowired private WebApplicationContext context; private MockMvc mvc; @Before public void setup() { mvc = MockMvcBuilders .webAppContextSetup(context) .apply(springSecurity()) .build(); } // ... other methods @WithMockUser("spring") @Test public void givenAuthRequestOnPrivateService_shouldSucceedWith200() throws Exception { mvc.perform(get("/private/hello").contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); } }
7. Тестирование защищенных методов с @SpringBootTest
@SpringBootTest не требует дополнительной конфигурации для тестирования защищенных методов. Мы можем просто позвоните методам напрямую и используйте @WithMockUser по мере необходимости:
@RunWith(SpringRunner.class) @SpringBootTest public class SecuredMethodSpringBootIntegrationTest { @Autowired private SecuredService service; @Test(expected = AuthenticationCredentialsNotFoundException.class) public void givenUnauthenticated_whenCallService_thenThrowsException() { service.sayHelloSecured(); } @WithMockUser(username="spring") @Test public void givenAuthenticated_whenCallServiceWithSecured_thenOk() { assertThat(service.sayHelloSecured()).isNotBlank(); } }
8. Тестирование с @SpringBootTest и TestRestTemplate
TestRestTemplate является удобным вариантом при написании интеграционных тестов для защищенных конечных точек REST.
Мы можем просто автопровод шаблона и установить учетные данные, прежде чем просить обеспеченных конечных точек:
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class SecuredControllerRestTemplateIntegrationTest { @Autowired private TestRestTemplate template; // ... other methods @Test public void givenAuthRequestOnPrivateService_shouldSucceedWith200() throws Exception { ResponseEntityresult = template.withBasicAuth("spring", "secret") .getForEntity("/private/hello", String.class); assertEquals(HttpStatus.OK, result.getStatusCode()); } }
TestRestTemplate является гибким и предлагает множество полезных вариантов, связанных с безопасностью. Для получения более подробной информации о TestRestTemplate , проверить наши статья на тему .
9. Заключение
В этой статье мы рассмотрели несколько способов выполнения интеграционных тестов с поддержкой безопасности.
Мы рассмотрели, как работать с mvccontroller и REST конечных точек, а также с защищенными методами.
Как обычно, весь исходный код для примера здесь может быть найдено на GitHub .