SecurityMockMvcResultHandlers

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

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

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

导出 SecurityContext

很多时候,我们想查询一个 repository,看看一些 MockMvc 请求是否真的持久化在数据库中。在某些情况下,我们的 repository 查询使用 Spring Data Integration,根据当前用户的用户名或任何其他属性来过滤结果。让我们看一个例子。

A repository interface:

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,否则它可能会在它们之间泄漏。