Как отключить защиту crsf в @WebFluxTest? - PullRequest
3 голосов
/ 12 марта 2020

Почему я получаю 403 FORBIDDEN для следующего теста?

@RestController
public class MyServlet {
    @PostMapping("/")
    public Mono<String> accept(Authentication authentication) {}
}


@WebFluxTest(MyServlet.class)
@WithMockUser
public class MyServletTest {
    @Autowired
    private WebTestClient webClient;

    @Test
    public void test() {
        webClient.post().url("/")
            .exchange()
            .expectStatus().isOk();
    }
}

Результат:

java.lang.AssertionError: Status expected:<200 OK> but was:<403 FORBIDDEN>

> POST /
> WebTestClient-Request-Id: [1]
> Content-Type: [application/json]

No content

< 403 FORBIDDEN Forbidden
< Content-Type: [text/plain]
< Cache-Control: [no-cache, no-store, max-age=0, must-revalidate]
< Pragma: [no-cache]
< Expires: [0]
< X-Content-Type-Options: [nosniff]
< X-Frame-Options: [DENY]
< X-XSS-Protection: [1 ; mode=block]
< Referrer-Policy: [no-referrer]

CSRF Token has been associated to this client

Насколько я знаю, @WebFluxTest отключает csrf. Так почему же он жалуется?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Это происходит потому, что у вас, вероятно, есть spring-boot-starter-security в вашем классе. Вам необходимо создать конфигурацию:

@Configuration
@EnableWebFluxSecurity
public class WebFluxSecurityConfig {
  @Bean
  public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    return http.csrf().disable().build();
  }
}

и импортировать ее в свой тест с помощью

@Import(WebFluxSecurityConfig.class)

Очевидно, что SecurityConfig по умолчанию не загружается в @WebFluxTest.

Я нашел решение здесь: https://github.com/spring-projects/spring-boot/issues/16088

0 голосов
/ 12 марта 2020
webClient.mutateWith(csrf()).post()...;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...