【发布时间】:2021-09-05 22:57:39
【问题描述】:
我有一个带有 spring security 5 的 spring boot-2.5.1 应用程序。
WebSecurityConfig 如下所示:
@Slf4j
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private final CustomProperties customProperties;
@Override
protected void configure(HttpSecurity http) throws Exception {
if (customProperties.isEnabled()) {
log.info("authentication enabled.");
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.oauth2Login()
.redirectionEndpoint()
.baseUri(customProperties.getAuthorizationResponseUri())
.and()
.userInfoEndpoint(userInfo -> userInfo.userService(new CustomOAuth2UserService()::loadUser));
} else {
log.info("authentication disabled.");
http.authorizeRequests()
.anyRequest()
.permitAll();
}
}
public void configure(WebSecurity webSecurity) {
webSecurity.ignoring()
.antMatchers("/actuator/info", "/actuator/health/*");
}
}
}
控制器如下所示:
@Controller
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@PostMapping("/users")
public @ResponseBody Mono<Map<String, String>> saveUsers(@RequestBody List<UserDto> userDtos) {
return userService.saveUser(userDtos);
}
}
上述控制器对应的JUnit:
@AutoConfigureMockMvc
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@SneakyThrows
@Test
@WithMockTestUser
void shouldSaveUsers() {
var userDtos = "...";
mockMvc.perform(post("/users")
.contentType(APPLICATION_JSON)
.content(userDtos))
.andDo(print())
.andExpect(status().isOk());
}
}
JUnit 没有 CSRF 的状态为 OK 而不是禁止的请求。 如果我调试,我可以看到,如果 csrf() 不包括在内,则不会生成令牌并分配给请求。但是,请求仍然通过。理想情况下,它应该抛出禁止的请求访问。
即使使用 csrf(),我也可以看到生成令牌并分配给参数。
在这两种情况下,我都没有看到任何地方正在验证 POST 请求是否包含 mockmvc 令牌。
mockmvc 是否需要任何额外的配置来验证 POST 请求是否包含 CSRF?
【问题讨论】:
标签: spring-boot spring-security csrf spring-test mockmvc