Spring Security OAuth и Cucumber доступ запрещен - PullRequest
0 голосов
/ 11 октября 2018

Я прочитал целый день статьи о том, как связать 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 ()", тогда он работает...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...