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