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

Я настраиваю модульные тесты для своих контроллеров Spring MVC и пытаюсь использовать тестовую среду Spring MVC. Для каждой конечной точки в моем контроллере я хочу обеспечить доступ только пользователям с назначенными полномочиями. Моя проблема в том, что я использую пользовательскую реализацию пользователя и получаю исключения приведения классов при использовании инструментов 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, чтобы я мог установить свой пользовательский принцип пользователя в Authentication. Меня беспокоит то, что я буду ограничен тестированием одного пользователя для каждого метода, и это не масштабируется для того, что я пытаюсь сделать.

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


person The Gilbert Arenas Dagger    schedule 12.04.2016    source источник


Ответы (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 соответственно.

person The Gilbert Arenas Dagger    schedule 12.04.2016
comment
каково содержание метода createAuthentication? - person mpr; 27.11.2018
comment
что такое метод createAuthentication? Пытливые умы хотят знать! - person bharal; 10.04.2019