Spring Security Unit Test - MockMvc выполняет тест с пользовательским пользователем

Я настраиваю модульные тесты для своих контроллеров Spring MVC и пытаюсь использовать среду тестирования Spring MVC. Для каждой конечной точки в моем контроллере я хочу обеспечить доступ только пользователям с назначенными полномочиями. Моя проблема заключается в том, что я использую пользовательскую реализацию User и получаю исключения приведения классов при использовании инструмента mockMvc.

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

 mockMvc.perform(MockMvcRequestBuilders.get(path).with(user("user").authorities(authorities)))
                .andExpect(status().isOk())
                .andExpect(authenticated().withUsername("user"));

Я хотел бы как-то настроить приведенное выше утверждение, чтобы указать мой пользовательский принципал пользователя. См. Метод пользователя Spring ниже. Моей первой мыслью было переопределить класс UserRequestPostProcessor и настроить его так, чтобы он использовал мой пользовательский тип пользователя вместо стандартного пользователя Spring Security, но этот класс объявлен как final и не может быть разделен на подклассы. Есть ли поддержка для переопределения поведения по умолчанию и использования пользовательского типа?

public static UserRequestPostProcessor user(String username) {
        return new UserRequestPostProcessor(username);
}

Из того, что я видел, я являюсь кандидатом для аннотирования моих тестов с помощью @WithSecurityContext, чтобы я мог установить своего пользовательского принципала пользователя в Аутентификации. Меня беспокоит то, что я буду ограничен тестированием одного пользователя для каждого метода, и это не соответствует тому, что я пытаюсь сделать.

Как я могу проверить запросы, сделанные несколькими пользовательскими пользователями?

1 ответ

Решение

Я узнал о двух способах сделать это:

  1. Я мог бы создать класс, который реализует UserDetails и расширяет мой основной пользовательский основной класс. Затем я мог бы передать это как параметр пользовательскому методу.

  2. Я могу полностью поцарапать пользовательский метод и передать мою аутентификацию, уже установленную с моим пользовательским принципалом пользователя.

Я пошел с последним.

protected void performTest(HttpMethod method, String path, Object[] pathVariables, UserRoleEnum role,
        boolean expectAllowed) throws Exception {
    mockMvc.perform(buildRequest(method, path, pathVariables).with(authentication(createAuthentication(role))))
            .andExpect(expectAllowed ? status().isNotFound() : status().isForbidden())
            .andExpect(authenticated().withUsername("user"));
}

Обратите внимание buildRequest а также createAuthentication методы - это вспомогательные методы, которые я создал, тогда как все остальные методы предоставляются Spring. Вспомогательные методы возвращают MockHttpServletRequestBuilder а также Authentication соответственно.

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