Я прочитал целый день статьи о том, как связать Spring Security OAuth с Cucumber, но ни одна из них не соответствовала моему сценарию использования, я только что видел людей, имеющих один и тот же вопрос:
Цель состоит в том, чтобыбыть в состоянии получить доступ к «ограниченным» конечным точкам API из сценариев огурца и не получать досадных ошибок 401, так как метод @PreAuthorize запрещает доступ.Это очень похоже на тесты @WebMvcTest с использованием MockMvc, где вы можете легко внедрить цепочку фильтров безопасности и даже не заботиться о том, чтобы быть OAuth или нет в фоновом режиме, поскольку цепочка фильтров не настоящая.
Так что, когда дело доходит до огурца, я хочу иметь возможность иметь простой тест, помеченный
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
, который может использовать что-то вроде @WithMockUser @ WebMvcTest (...), но это, очевидно, не работает, как и в цепочке фильтров безопасности OAuth, ожидается настоящий токен jwt, и я работаю на конечных точках API (так что это своего рода черный ящик):
Так что я мог бы публиковать теперь весь код, ноУверяю вас, конфигурация безопасности - это действительно базовая настройка конфигурации SpringSecurity, подобная следующей, при попытке аутентификации в сценарии с огурцом:
@Override
public void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.sessionAuthenticationStrategy(sessionAuthenticationStrategy())
.and()
.exceptionHandling().authenticationEntryPoint((req, rsp, e) -> rsp.sendError(HttpServletResponse.SC_UNAUTHORIZED, e.getMessage()))
.and()
.authorizeRequests()
.antMatchers("/**").authenticated();
}
Я думал о следующих решениях, но ни одно из них не является реальнымрешение или работало:
- Отключить защиту в контексте тестирования огурца: 401 исчезнет, но я могне проверять ACL, так что это действительно не то, что мне нужно
- Попытка @WithMockUser, как в MockMvc: не работает
- Попытка создать поддельный jwt в тесте и добавить его в симуляциюclient: хорошо, подделка OAuth2AuthenticationDetails - беспорядок в перехватчике
- , пытающийся установить «SecurityContextHolder.getContext (). setAuthentication (аутентификация)» в определениях шагов: ну, это терпит неудачу в цепочке фильтров безопасности, а также будет отказыватьесли бы я напрямую позвонил в базовый сервис.
Так что, может быть, кто-то знает решение этой очень распространенной проблемы аутентификации сценария в огурце с использованием Spring Security OAuth, при условии , чтогде-то нет настоящего сервера авторизации, с которым можно было бы общаться, поскольку это не сквозной тест.Поэтому я думаю, что мне нужно пойти по пути создания «тестового JWT» и присоединить его к симметричному клиентскому запросу, но как это можно сделать?Генерация не проблема, но как правильно ее прикрепить, если это было предпочтительным способом?
Когда я удаляю аннотацию @PreAuthorize из контроллера и изменяю «.antMatchers (» / "). authenticated ()" to ".antMatchers (" /"). anonymous ()", тогда он работает...