SecurityMockMvcResultHandlers

Spring Security 提供了一些 ResultHandler 实现。为了使用 Spring Security 的 ResultHandler 实现,请确保使用以下静态导入

import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultHandlers.*;

导出 SecurityContext

我们经常希望查询存储库,以查看某个 MockMvc 请求是否实际持久化到数据库中。在某些情况下,我们的存储库查询使用 Spring Data 集成 根据当前用户的用户名或任何其他属性过滤结果。让我们看一个例子

一个存储库接口

private interface MessageRepository extends JpaRepository<Message, Long> {
	@Query("SELECT m.content FROM Message m WHERE m.sentBy = ?#{ principal?.name }")
	List<String> findAllUserMessages();
}

我们的测试场景

mvc
	.perform(post("/message")
		.content("New Message")
		.contentType(MediaType.TEXT_PLAIN)
	)
	.andExpect(status().isOk());

List<String> userMessages = messageRepository.findAllUserMessages();
assertThat(userMessages).hasSize(1);

此测试将无法通过,因为请求完成后,SecurityContextHolder 将被过滤器链清除。然后我们可以将 TestSecurityContextHolder 导出到我们的 SecurityContextHolder 并按需使用

mvc
	.perform(post("/message")
		.content("New Message")
		.contentType(MediaType.TEXT_PLAIN)
	)
	.andDo(exportTestSecurityContext())
	.andExpect(status().isOk());

List<String> userMessages = messageRepository.findAllUserMessages();
assertThat(userMessages).hasSize(1);

请记住在测试之间清除 SecurityContextHolder,否则它可能会在测试之间泄漏

© . This site is unofficial and not affiliated with VMware.