# 安全模型cresulthandlers
Spring 安全性提供了一些ResultHandler
s的实现方式。为了使用 Spring Security的ResultHandler
s实现,确保使用以下静态导入:
import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultHandlers.*;
# 导出SecurityContext
通常情况下,我们希望查询存储库,以查看某些MockMvc
请求是否确实在数据库中持续存在。在某些情况下,我们的存储库查询使用Spring Data Integration基于当前用户的用户名或任何其他属性来过滤结果。让我们来看一个例子:
存储库接口:
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 ,否则它可能会在测试之间泄漏。 |
---|