国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 幫助中心 > 正文

SpringSecurity 測試實戰

2024-07-09 22:41:59
字體:
來源:轉載
供稿:網友

引言

試題管理系統的安全模塊使用Spring Security,代碼從原華軟倉庫移植,在移植的過程中,發現原測試編寫的不好,遂在新系統中對安全模塊測試進行了重構。

Spring 測試

添加@SpringBootTest注解,意為這是一個基于SpringBoot的單元測試。

SpringBoot在官方的Guide中提供了多種測試方式。

@SpringBootTest注解中的webEnvironment屬性可以配置測試環境,默認為MOCK環境。

/** * The type of web environment to create when applicable. Defaults to * {@link WebEnvironment#MOCK}. * @return the type of web environment */WebEnvironment webEnvironment() default WebEnvironment.MOCK;

模擬環境測試

啟用Spring Security后,單元測試中對api的測試會被Spring Security的Filter進行攔截,所以測試之前需要進行用戶登錄操作。

之前都是使用比較笨重的方法,寫一個@Before,@Before里進行登錄,之后再執行測試方法。

最近在閱讀Spring Security Test文檔之后,終于找到一種模擬登錄十分簡便的方法,@WithMockUser。

test method with mock user - spring security test

引入Spring Security Test依賴:

<!-- Spring Security Test --><dependency>  <groupId>org.springframework.security</groupId>  <artifactId>spring-security-test</artifactId>  <scope>test</scope></dependency>

示例代碼如下:

@SpringBootTest@RunWith(SpringRunner.class)@AutoConfigureMockMvc@WithMockUser(username = "admin", password = "admin")public class ControllerTest {  @Autowired  protected MockMvc mockMvc;  @Test  void contextLoads() {  }}

注:@RunWith(SpringRunner.class)表示當前測試使用org.springframework.test.context.junit4.SpringRunner類來執行,最新的SpringBoot版本中已經全面啟用junit5,不推薦使用junit4.SpringRunner,因為未經過內部學習與測試,未在生產項目中使用。

真實環境測試

為了減少學習與溝通的成本,之前,所有的測試規定都在MOCK環境下,使用MockMVC進行api測試。

雖然MOCK環境能解決大部分的問題,并且可以在不啟動Server的情況下直接進行測試,但在某些場景下,仍需要真實環境下的HTTP服務與請求測試。

啟用Spring Security后,MockMVC是直接測試控制器,并非在真實的HTTP服務器下進行測試,MOCK環境中使用的是MockHttpSession,這不是標準的Session實現,沒有加入對COOKIE的支持,所以在測試安全模塊時,無法像瀏覽器一樣測試COOKIE等認證信息。

spring mockmvc doesn't contain cookies - stackoverflow

去StackOverflow上也沒有解決方案,答案推薦使用TestRestTemplate+真實的服務器環境進行單元測試。

將webEnvironment配置為SpringBootTest.WebEnvironment.RANDOM_PORT,即表示當前測試在一個隨機端口的真實Web環境下運行。

@RunWith(SpringRunner.class)@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)class AuthControllerTest {  @Autowired  private TestRestTemplate restTemplate;}

測試時使用TestRestTemplate進行網絡請求的發送,真實模擬Web服務器環境。

示例代碼如下:

logger.debug("3: 測試用戶名密碼正確");username = RIGHT_USERNAME;password = RIGHT_PASSWORD;response = this.restTemplate    .withBasicAuth(username, password)    .getForEntity(CONFIG_LOGIN, Void.class);logger.debug("斷言: 狀態碼為200");assertThat(response.getStatusCode().value()).isEqualTo(HttpStatus.OK.value());logger.debug("獲取 response 的 Set-Cookie 信息,并斷言");String setCookie = response.getHeaders().getFirst(HttpHeaders.SET_COOKIE);assertThat(setCookie).isNotNull();
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 察雅县| 大新县| 祁连县| 淳化县| 扎鲁特旗| 理塘县| 大关县| 左云县| 隆回县| 靖州| 乳源| 西贡区| 三门县| 云阳县| 新和县| 凤山市| 汉寿县| 黄骅市| 昌图县| 肃宁县| 政和县| 任丘市| 大英县| 古交市| 宁德市| 镇雄县| 菏泽市| 蓬溪县| 莎车县| 同仁县| 皮山县| 陆良县| 仲巴县| 定边县| 射洪县| 成安县| 秭归县| 定日县| 承德市| 山西省| 苗栗县|