#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, если в приложении требуется https4. @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.