Рубрики
Без рубрики

Весенняя безопасность для весенних тестов интеграции загрузки

Узнайте, как выполнить интеграционные тесты с поддержкой Spring Security

Автор оригинала: 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 {
        ResponseEntity result = template.withBasicAuth("spring", "secret")
          .getForEntity("/private/hello", String.class);
        assertEquals(HttpStatus.OK, result.getStatusCode());
    }
}

TestRestTemplate является гибким и предлагает множество полезных вариантов, связанных с безопасностью. Для получения более подробной информации о TestRestTemplate , проверить наши статья на тему .

9. Заключение

В этой статье мы рассмотрели несколько способов выполнения интеграционных тестов с поддержкой безопасности.

Мы рассмотрели, как работать с mvccontroller и REST конечных точек, а также с защищенными методами.

Как обычно, весь исходный код для примера здесь может быть найдено на GitHub .