Весенний тест безопасности с помощью MockMvc, MockHttpServletRequestBuilder::с пользователем по протоколу https

#spring #spring-boot #spring-security

Вопрос:

У меня проблема с https в весеннем тесте.

В моем приложении я использую пользовательский класс , который реализует UserDetails , из-за этого, когда я использую аннотацию @WithMockUser , результатом является исключение приведения:

org.springframework.security.core.userdetails.User cannot be cast to class my.custom.implemtantion.MyCustomUserDetailsUser.class

поэтому, чтобы справиться с этим, я вынужден использовать метод MockHttpServletRequestBuilder.with() :

 mockMvc.perform(get(API_URL)  .with(user(myCustomUserDetailsUser)))  .andExpect(status().isOk())  

все это работает нормально, прежде чем я добавлю https в конфигурацию безопасности. Теперь, когда я использую с, я получаю 500

Я знаю, что при использовании MockMvc мне нужно создать боб и установить .defaultRequest(METHOD("/").secure(true)) , но как с этим справиться MockHttpServletRequestBuilder::with ? Есть ли что-то подобное внутри MockMvc ? Или, может быть, есть что-то подобное MockHttp**s**ServletRequestBuilder::with ?

@редактировать

Тогда основная проблема заключается в том, когда я использую боб для тестирования:

 @Bean  public MockMvc mockMvc(WebApplicationContext context) {  return MockMvcBuilders  .webAppContextSetup(context)  .defaultRequest(get("/").secure(true))  .build();  }  

тесты, в которых я использую .with(user(myCustomUserDetailsUser))) , завершаются неудачей с ответом 500 (участники равны нулю).

Когда я удаляю боб и устанавливаю: mockMvc.perform(get(API_URL).secure(true).with(user(myCustomUserDetailsUser)) все работает нормально. Но я не хочу устанавливать набор для всех (100 ) тестов .secure(true)

Комментарии:

1. Ты пробовал mockMvc.perform(get(API_URL).secure(true).with(user(myCustomUserDetailsUser)) ?

2. Ваш вопрос неясен. Единственное, что нужно изменить, — это URL-адрес, все остальное будет таким же. MockMvc на самом деле вообще не заботится о http/https, поскольку он будет работать в издевательской среде, а не в реальной. Так что не уверен, что вы пытаетесь протестировать с помощью MockMvc на самом деле.

3. @M. Deinum если вы не объявите в MockMvcBuilders, .defaultRequest(get("/").secure(true)) возврат составит 305, если в приложении требуется https

4. @EleftheriaStein-Кусатана, да, это работает. Но когда у меня также есть бобовый MockMvc с .defaultRequest(get("/").secure(true)) ответом 500. У меня их более 100 . Если я удалю компонент MockMvc, мне нужно будет отредактировать весь мой тест и установить безопасное значение true вручную в каждом тесте

5. Основная проблема заключается в том, что вы объявляете компонент, который в основном разрушает способность Spring Boots предоставлять вам предварительно настроенный компонент. Что вам нужно сделать, так это зарегистрировать MockMvcConfigurer , который адаптирует конструктор с запросом по умолчанию, включая флаг безопасности и пользователя.

Ответ №1:

Я решаю проблему с добавлением MockMvcConfigurer в MockMvcBuilders. Теперь боб выглядит так:

 @Bean  public MockMvc mockMvc(WebApplicationContext context) {  return MockMvcBuilders  .webAppContextSetup(context)  .apply(springSecurity())  .defaultRequest(get("/").secure(true))  .defaultRequest(post("/").secure(true))  .defaultRequest(put("/").secure(true))  .build();  }  

Откуда springSecurituty() пришел org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; и возвращайся new SecurityMockMvcConfigurer()

Спасибо господину Дейну за подсказку о MockMvcConfigurer.