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 ответ
Я узнал о двух способах сделать это:
Я мог бы создать класс, который реализует UserDetails и расширяет мой основной пользовательский основной класс. Затем я мог бы передать это как параметр пользовательскому методу.
Я могу полностью поцарапать пользовательский метод и передать мою аутентификацию, уже установленную с моим пользовательским принципалом пользователя.
Я пошел с последним.
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
соответственно.