Почему POST-запрос в @WebMvcTest возвращает 403 с allowAll () - PullRequest
1 голос
/ 17 мая 2019

Я тестирую контроллер с отображением POST.Вот выдержка:

@RequestMapping(path = "/bookForm", method = POST)
public String saveBook(@Valid @ModelAttribute(name = "book") BookCommand bookCommand,
                       BindingResult bindingResult) {
        // blah blah

        return "redirect:/books";
    }

Я играю с безопасностью Spring, поэтому я написал тест, в котором я ожидаю, что некоторые из моих сопоставлений GET будут отклонены для неавторизованного пользователя, но для этого метода POSTЯ хотел разрешить все.

Вот класс конфигурации теста:

@Configuration
public class SecurityTestConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/books/**").authenticated()
                .antMatchers(HttpMethod.POST, "/bookForm").permitAll()
                .and()
                .httpBasic();
    }
}

Дело в том, что mockMvc по-прежнему возвращает 4xx для вызова POST.Почему это?

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = BookController.class)
@Import(SecurityTestConfig.class)
public class BookControllerIT {

    @Autowired
    private MockMvc mockMvc;

    // ... mocks ect


    @Test // <- this is ok
    public void shouldNotAllowBookUpdate() throws Exception {
        mockMvc.perform(get("/books/1/update")).andExpect(status().is4xxClientError());
    }

    @Test // <- this fails
    public void shouldAllowFormHandling() throws Exception {
        mockMvc.perform(post("/bookForm")).andExpect(status().isOk());
    }
}

1 Ответ

3 голосов
/ 17 мая 2019

Вы должны использовать только одну Картографическую аннотацию either @PostMapping(value="...") OR @RequestMapping(value="...",method=POST). Также внесите следующие изменения в TestConfig


http
         .csrf().disable()
         .authorizeRequests()
         .antMatchers(HttpMethod.POST,"/bookFrom").permitAll()  
         .anyRequest().authenticated();
...