跳到主要内容
版本:7.0.2

SecurityMockMvcResultHandlers

DeepSeek V3 中英对照 Security ResultHandlers 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,否则它可能会在测试之间泄漏。