我有一个带有SpringSecurity5的SpringBoot-2.5.1应用程序。
WebSecurity配置如下所示:
@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());
}
}
上面没有csrf的junit将状态设置为ok,而不是禁止请求。若我调试,我可以看到,若csrf()并没有包含,那个么就不会生成任何令牌并将其分配给请求。然而,请求仍在通过。理想情况下,它应该抛出禁止的请求访问。
即使使用csrf(),我也可以看到令牌被生成并分配给参数。
在这两种情况下,无论post请求是否包含csrf令牌,我都看不到使用mockmvc验证post请求的任何地方。
mockmvc是否需要任何额外的配置来验证post请求是否包含csrf?
1条答案
按热度按时间zqry0prt1#
而不是自动配置
MockMvc
,你需要建立MockMvc
使用SecurityMockMvcConfigurers.springSecurity()
.这将添加名为“springsecurityfilterchain”的Springbean作为过滤器,并确保
TestSecurityContextHolder
对每个请求都使用。