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

© . This site is unofficial and not affiliated with VMware.