Я пытаюсь настроить тест RestAssured для приложения Spring-Boot с защищенными контроллерами уровня метода.
Например, у меня есть этот минимальный контроллер, использующий метод уровня безопасности
@RestController
public class DummyController {
@GetMapping("/")
@PreAuthorize("hasRole('TEST')") // removing this should make the test green
public String test() {
return "hello";
}
}
и разрешительная конфигурация безопасности
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll();
}
}
Тогда этот простой тест с использованием RestAssured завершается неудачей:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
public class DummyControllerITest {
private static final Logger logger = LoggerFactory.getLogger(DummyControllerITest.class);
@LocalServerPort
private int port;
@Test
@WithMockUser(roles = "TEST")
public void name() throws Exception {
RestAssured.given()
.port(port)
.when()
.get("/")
.then()
.statusCode(HttpStatus.OK.value());
}
}
Почему этот тест не пройден, даже если фиктивный пользователь настроен на правильную роль?
Я отладил это, и кажется, что SecurityContext в потоке, выполняющем тест, настроен правильно, в то время как SecurityContext в потоке, обрабатывающем запрос RestAssured, не заполняется. Но ... почему?