Как проверить безопасный контроллер Spring - PullRequest
1 голос
/ 23 января 2020

В настоящее время у меня есть приложение, созданное с использованием Spring Boot 2, Spring MVC, Spring Data / JPA и Thymeleaf.

Я пишу некоторые модульные / интеграционные тесты и хотел бы протестировать контроллер , который защищен SpringSecurity и базой данных с зарегистрированными пользователями.

Каков наилучший подход для проверки? Я безуспешно пытался использовать некоторые из них, например, использовать аннотации типа @WithMockUser.

Редактировать: просто напоминание, что я не тестирую @RestController с. Я напрямую внедряю @Controller в свой тестовый класс и вызываю его методы. Он прекрасно работает без Spring Security.

Один пример:

@Controller
public class SecuredController {
  @GetMapping("/")
  public String index() {
    return "index";
  }
}

Путь / защищен Spring Security и обычно перенаправляет на /login для аутентификации пользователя.

Мой модульный тест выглядел бы так:

@WebMvcTest(controllers = SecuredController.class)
class SecuredControllerTest {

  @Autowired
  private SecuredController controller;

  @Autowired
  private MockMvc mockMvc;

  @Test
  @WithMockUser(username = "user", password = "pass", roles = {"USER"})
  public void testAuthenticatedIndex() throws Exception {
    mockMvc.perform(get("/"))
        .andExpect(status().isOk())
        .andDo(print());
  }
}

Первая ошибка, которую я получаю, это то, что меня просят ввести мою реализацию UserDetailsService, чего я бы хотел избежать. Но если я внедряю сервис, тест работает, но возвращает 404 вместо 200.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 23 января 2020

Вам нужно будет добавить свои настройки безопасности в контекст Spring, импортировав свой класс WebSecurityConfigurerAdapter.

@WebMvcTest(controllers = SecuredController.class)
@Import(SecuredControllerTest.Config.class)
class SecuredControllerTest {

   @Configuration
   @EnableWebSecurity
   static class Config extends MyWebSecurityConfigurerAdapter {
      @Autowired
      public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
          auth.inMemoryAuthentication().withUser("user").password("pa$$").roles("USER");
          auth.inMemoryAuthentication().withUser("admin").password("pa$$").roles("ADMIN");
      }
   }

   ...
}

Встроенный static class Config просто меняет то, откуда мы получаем пользователей, в этом на случай inMemoryAuthentication будет достаточно.

0 голосов
/ 23 января 2020

В тестовом классе используйте аннотации

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

в методе теста настройки

@Before

В реальном методе теста

@WithMockUser("spring")
@Test

Тестирование Spring Security, как в этих примерах

https://spring.io/blog/2014/05/23/preview-spring-security-test-web-security

https://www.baeldung.com/spring-security-integration-tests

...