### 安全模型cresulthandlers

Spring 安全性提供了一些`ResultHandler`s的实现方式。为了使用 Spring Security的`ResultHandler`s实现，确保使用以下静态导入：

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

#### 导出SecurityContext

通常情况下，我们希望查询存储库，以查看某些`MockMvc`请求是否确实在数据库中持续存在。在某些情况下，我们的存储库查询使用[Spring Data Integration](../../../features/integrations/data.html)基于当前用户的用户名或任何其他属性来过滤结果。让我们来看一个例子：

存储库接口：

```
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`，否则它可能会在测试之间泄漏。|
|---|---------------------------------------------------------------------------------------------|

[安全结果匹配器](result-matchers.html)[Appendix](../../appendix/index.html)