Spring Security + Контроллер тестирования Spring-Boot

Пытаюсь протестировать домашний контроллер

@RequestMapping("/")
@ResponseBody
String home() {
    return "Hello World!";
}

Я использую Spring Security, используя имя пользователя «user» и тестирую его как пароль по умолчанию, но @PreAuthorize не работает

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@PreAuthorize("hasRole('ADMIN')")
public class HomeControllerTest {

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    @WithMockUser(username = "user", password = "test", roles = "ADMIN")
    public void home() throws Exception {
        String body = this.restTemplate.getForObject("/", String.class);
        assertThat(body).isEqualTo("Hello World!");
    }

}

Результат

Ожидаемый результат:

‹" [Привет, мир!] ">

Фактический результат:

‹" {"Timestamp": 1501100448216, "status": 401, "error": "Unauthorized", "message": "Для доступа к этому ресурсу требуется полная аутентификация", "path": "/"}] ">

Я что-то упускаю?


person Carlos Chávez    schedule 26.07.2017    source источник
comment
Вы вызываете настоящий контроллер, поэтому использование @WithMockUser здесь практически бесполезно. Это сработает только в том случае, если вы напрямую вызовете метод home() на контроллере. Предполагая, что у вас есть базовая настройка аутентификации для входа в систему, вы должны отправить учетные данные с вашим запросом. Также @PreAuthorize в вашем тестовом примере ничего не добьется.   -  person M. Deinum    schedule 28.07.2017


Ответы (1)


Попробуйте добавить в свой тестовый класс следующее:

@TestExecutionListeners(mergeMode = MergeMode.MERGE_WITH_DEFAULTS, listeners = {
        WithSecurityContextTestExecutionListener.class
})

И следующая зависимость, если у вас ее нет:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <scope>test</scope>
</dependency>

Безопасность Spring требует дополнительного слушателя, которого нет в тестах по умолчанию, поэтому вам нужно указать Spring добавить его, указав аннотацию @TestExecutionListeners в режиме merge, чтобы он объединял текущие перечисленные слушатели со слушателями, которые вы хотите добавить - в этом случае WithSecurityContextTestExecutionListener

person Tom    schedule 27.07.2017
comment
Спасибо, но ничего не вышло, я получаю тот же результат: / - person Carlos Chávez; 27.07.2017
comment
Попробуйте также добавить ROLE_ADMIN к roles в @WithMockUser. Безопасность Spring по умолчанию проверяет префикс ROLE (но в @PreAuthorize оставьте его как ADMIN) - person Tom; 28.07.2017