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,否則它可能會在它們之間洩漏