gpt4 book ai didi

spring - 为什么 @WebMvcTest 中的 POST 请求使用 permitAll() 返回 403

转载 作者:行者123 更新时间:2023-12-01 21:57:00 31 4
gpt4 key购买 nike

我正在测试具有 POST 映射的 Controller 。这是摘录:

@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 仍然会为 POST 调用返回 4xx。这是为什么?

@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());
}
}

最佳答案

您应该只使用一个映射注解@PostMapping(value="...") 或@RequestMapping(value="...",method=POST)。同时在 TestConfig

中进行以下更改
http
.csrf().disable()
.authorizeRequests()
.antMatchers(HttpMethod.POST,"/bookFrom").permitAll()
.anyRequest().authenticated();

关于spring - 为什么 @WebMvcTest 中的 POST 请求使用 permitAll() 返回 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56179875/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com