对于最新的稳定版本,请使用 Spring Security 6.4.1spring-doc.cadn.net.cn

SecurityMockMvcResultHandlers

Spring Security 提供了一些ResultHandler的实现。 为了使用 Spring Security 的ResultHandlers 实现确保使用以下静态导入:spring-doc.cadn.net.cn

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

导出 SecurityContext

很多时候,我们想查询一个仓库,看看是否有一些MockMvc请求实际上保留在数据库中。 在某些情况下,我们的存储库查询使用 Spring Data Integration 根据当前用户的用户名或任何其他属性筛选结果。 让我们看一个例子:spring-doc.cadn.net.cn

存储库接口:spring-doc.cadn.net.cn

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

我们的测试场景:spring-doc.cadn.net.cn

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

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

此测试不会通过,因为在我们的请求完成后,SecurityContextHolder将被 Filter Chain 清除。 然后我们可以导出TestSecurityContextHolder到我们的SecurityContextHolder并根据需要使用它:spring-doc.cadn.net.cn

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或者它可能在它们之间泄漏spring-doc.cadn.net.cn