Невозможно имитировать сервер ресурсов JWT Spring для тестирования

Мой сервер авторизации представляет собой автономный экземпляр keycloak, который я предпочитаю протестировать, чем получить доступ к реальному. Теперь я определил свой фильтр безопасности следующим образом:

@Bean
    public SecurityFilterChain securityFilterChain (HttpSecurity http) throws Exception{
        http.csrf(AbstractHttpConfigurer::disable);
        http.authorizeHttpRequests(requests -> requests
                                    .anyRequest().hasRole("USER")
                                    );
        http.oauth2ResourceServer(oauth2 -> {
            oauth2.jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthConverter));
            oauth2.authenticationEntryPoint(unauthorizedHandler);
            }
            );
//        http.addFilterAfter()
        http.exceptionHandling(exception -> {
            exception.accessDeniedHandler(accessDeniedHandler);
        });
        return http.build();
    }

Теперь я высмеивал авторизацию JWT следующим образом:

@Bean
    public SecurityMockMvcRequestPostProcessors.JwtRequestPostProcessor jwtRequestPostProcessor() {
        SecurityMockMvcRequestPostProcessors.JwtRequestPostProcessor data = jwt().jwt(builder -> {
            builder.issuer("http://auth.localhost/realms/CompetitionManager");
            builder.claim("azp", "competition-manager-web");
            builder.claim("preferred_username", "testUser");
            builder.claim("email", "[email protected]");
            builder.claim("resource_access", Map.of("competition-manager-web", Map.of("roles", List.of("USER"))));
        });
        return data;
    }

Предположительно, отсутствуют ключи, но, согласно документации, это будет обработано системой безопасности Spring. А тест выглядит так:

@SpringJUnitConfig(classes = {JwtTestConfig.class})
public class ContestControllerTest {
    
    /* Autowiring JPA repositories & interfaces */
    
    
    @Autowired
    private SecurityMockMvcRequestPostProcessors.JwtRequestPostProcessor defaultJwt;

    @Test
    @Order(2)
    public void getListOfContests_then200() throws Exception {
        mockMvc.perform(get("/contests/list").with(defaultJwt))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("$").isArray())
                .andExpect(jsonPath("$", hasSize(2)))
                .andExpect(jsonPath("$[*]", containsInAnyOrder("visible test contest 1", "visible test contest 2")));
    }

Однако, как указано в документации, это не проходит. Токен передан правильно, это точно, так как я получаю 403, а не 401, а в других тестовых случаях доступ к preferred_username осуществляется и используется, но он не проходит через фильтры авторизации, и я получаю только короткое сообщение «Доступ запрещен». без каких-либо подробностей. Я что-то упустил в определении токена?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При использовании SecurityMockMvcRequestPostProcessors ваш jwtAuthConverter bean-компонент не используется. Постпроцессор сам строит JwtAuthenticationToken.

Два варианта:

  • явно задайте нужные полномочия при настройке постпроцессоров (обратите внимание, что я написал «полномочия», а не «утверждения, которые вы ожидаете сопоставить с полномочиями»)
  • используйте @WhithJwt или @WithMockJwtAuth из Spring-addons-oauth2-test . Оба будут использовать ваш jwtAuthConverter, если он представлен как @Bean. Использование в репозитории проекта Github или в этой статье Baeldung

Отказ от ответственности

Я написал все это (включая SecurityMockMvcRequestPostProcessors для OAuth2 в spring-security-test).

Другие вопросы по теме

Похожие вопросы

Проблема сборки bazel - ключевое слово com.sun.tools.javac или var вызывает сбой
Логика, которую нужно реализовать, чтобы получить максимальное количество очков
Невозможно установить артефакт Maven, хотя он, кажется, указан в репозитории Maven
Задача требует сортировки строки, состоящей из строчных и прописных букв
Почему вызывается пользовательский прослушиватель, когда я не подключаю его к TestClass ни через аннотацию, ни через XML-файл пакета? (ТестНГ)
Почему вызов метода take() Java DelayQueue не блокирует всю структуру данных для всех потоков?
Это фабричный паттерн или паттерн стратегии?
Что происходит с потерянной частью односвязного списка, когда я добавляю цикл в середине?
Можно ли заставить picocli не перезаписывать значение, установленное в конструкторе, если в cli нет опции?
Spring MVC: нет конвертера для [класса com.gcu.model.OrderList] с предустановленным типом контента «null»