У меня возникают проблемы при тестировании сервера ресурсов oauth2 с использованием @WebMvcTest и метода POST HTTP.
Я всегда получаю код состояния 403, когда не отправляю токен csrf, даже если токен не требуется, когда я использую токен носителя.
Вот метод POST, который я хочу протестировать.
@PostMapping("/message")
public String createMessage(@RequestBody String message) {
return String.format("Message was created. Content: %s", message);
}
Вот моя конфигурация безопасности:
http.authorizeRequests(authorizeRequests -> authorizeRequests
.antMatchers("/message/**")
.hasAuthority("SCOPE_message:read")
.anyRequest().authenticated()
).oauth2ResourceServer(oauth2ResourceServer ->
oauth2ResourceServer
.jwt(withDefaults())
);
Я следую тестам, представленным в примерах пружинная безопасность.
Предполагалось, что следующий тест будет пройден, но он не пройден, потому что токен csrf не отправляется в запросе.
mockMvc.perform(post("/message").content("Hello message")
.with(jwt(jwt -> jwt.claim("scope", "message:read")))
.andExpect(status().isOk())
.andExpect(content().string(is("Message was created. Content: Hello message")));
Когда я добавляю токен csrf в запрос, тест проходит:
mockMvc.perform(post("/message").content("Hello message")
.with(jwt(jwt -> jwt.claim("scope", "message:read")))
.with(csrf()))
.andExpect(status().isOk())
.andExpect(content().string(is("Message was created. Content: Hello message")));
Когда я запускаю приложение, нет необходимости отправлять токен csrf в запросе POST.
Я разветвил репозиторий GitHub Spring Security, и проект с этим неудачным тестом доступен по адресу ссылка.
Есть ли способ настроить мои тесты, чтобы мне не нужно было отправлять токен csrf в запросе POST?
.csrf(csrf -> csrf.disable())
в вашей конфигурации безопасности. Все тесты примера проекта предназначены для запросов GET, поэтому им не требуется токен CSRF. - person Eleftheria Stein-Kousathana   schedule 19.07.2019curl -v -H "Authorization: Bearer $TOKEN" -d "my message" -X POST localhost:8080/message
я получаю статус 200. Насколько я понимаю, фильтр CSRF проверяет токен только в том случае, если токена Bearer нет. - person henriquels   schedule 19.07.2019jwt
, заключается в том, что, хотя он создает контекст безопасности, содержащий JWT, он не создает токен носителя в запросе (что и ищет фильтр CSRF). - person Eleftheria Stein-Kousathana   schedule 19.07.2019