自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring Security 實(shí)戰(zhàn)干貨:Spring Security中的單元測(cè)試

開發(fā) 前端
今天組里的新人迷茫的問我:哥,Spring Security弄的我單元測(cè)試跑不起來,總是401,你看看咋解決。沒問題,有寫單元測(cè)試的覺悟,寫的代碼質(zhì)量肯定有保證,對(duì)代碼質(zhì)量重視的態(tài)度,這種忙一定要幫!

[[395171]]

今天組里的新人迷茫的問我:哥,Spring Security弄的我單元測(cè)試跑不起來,總是401,你看看咋解決。沒問題,有寫單元測(cè)試的覺悟,寫的代碼質(zhì)量肯定有保證,對(duì)代碼質(zhì)量重視的態(tài)度,這種忙一定要幫!

Spring Security 測(cè)試環(huán)境

要想在單元測(cè)試中使用Spring Security,你需要在Spring Boot項(xiàng)目中集成:

  1. <dependency> 
  2.             <groupId>org.springframework.security</groupId> 
  3.             <artifactId>spring-security-test</artifactId> 
  4.             <scope>test</scope> 
  5.         </dependency> 

 

這樣測(cè)試的上下文配置就能和Spring Security結(jié)合起來了,接下來教你幾招。

Spring Security 測(cè)試

所有的測(cè)試都是在Spring Boot Test下進(jìn)行的,也就是@SpringBootTest注解的支持下。

@WithMockUser

@WithMockUser注解可以幫我們?cè)赟pring Security安全上下文中模擬一個(gè)默認(rèn)名稱為user,默認(rèn)密碼為password,默認(rèn)角色為USER的用戶。當(dāng)你的測(cè)試方法使用了該注解后,你就能通過:

  1. Authentication authentication = SecurityContextHolder.getContext() 
  2.            .getAuthentication(); 

獲取該模擬用戶的信息,也就“假裝”當(dāng)前登錄了用戶user。當(dāng)然你也可以根據(jù)需要來自定義用戶名、密碼、角色:

  1. @SneakyThrows 
  2. @Test 
  3. @WithMockUser(username = "felord",password = "felord.cn",roles = {"ADMIN"}) 
  4. void updatePassword() { 
  5.  
  6.     mockMvc.perform(post("/user/update/password"
  7.             .contentType(MediaType.APPLICATION_JSON) 
  8.             .content("{\n" + 
  9.                     "  \"newPassword\": \"12345\",\n" + 
  10.                     "  \"oldPassword\": \"12345\"\n" + 
  11.                     "}")) 
  12.             .andExpect(ResultMatcher.matchAll(status().isOk())) 
  13.             .andDo(print()); 

當(dāng)然你可以將@WithMockUser標(biāo)記到整個(gè)測(cè)試類上,這樣每個(gè)測(cè)試都將使用指定該用戶。

@WithAnonymousUser

@WithAnonymousUser是用來模擬一種特殊的用戶,也被叫做匿名用戶。如果有測(cè)試匿名用戶的需要,可以直接使用該注解。其實(shí)等同于@WithMockUser(roles = {"ANONYMOUS"}),也等同于@WithMockUser(authorities = {"ROLE_ANONYMOUS"}),細(xì)心的你應(yīng)該能看出來差別。

@WithUserDetails

雖然@WithMockUser是一種非常方便的方式,但可能并非在所有情況下都湊效。有時(shí)候你魔改了一些東西使得安全上下文的驗(yàn)證機(jī)制發(fā)生了改變,比如你定制了UserDetails,這一類注解就不好用了。但是通過UserDetailsService 加載的用戶往往還是可靠的。于是@WithUserDetails就派上了用場(chǎng)。

  1. @SneakyThrows 
  2. @Test 
  3. @WithUserDetails("felord"
  4. void updatePassword() { 
  5.  
  6.     mockMvc.perform(post("/user/update/password"
  7.             .contentType(MediaType.APPLICATION_JSON) 
  8.             .content("{\n" + 
  9.                     "  \"newPassword\": \"12345\",\n" + 
  10.                     "  \"oldPassword\": \"12345\"\n" + 
  11.                     "}")) 
  12.             .andExpect(ResultMatcher.matchAll(status().isOk())) 
  13.             .andDo(print()); 

當(dāng)我們執(zhí)行單元測(cè)試時(shí),將通過UserDetailsService 的loadUserByUsername方法查找用戶名為felord的用戶并加載到安全上下文中。

自定義注解

其實(shí)我們還可以模擬@WithMockUser

  1. @Target({ ElementType.METHOD, ElementType.TYPE }) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Inherited 
  4. @Documented 
  5. @WithSecurityContext(factory = WithMockUserSecurityContextFactory.class) 
  6. public @interface WithMockUser { 
  7.  
  8.    String value() default "user"
  9.  
  10.    String username() default ""
  11.  
  12.    String[] roles() default { "USER" }; 
  13.   
  14.    String[] authorities() default {}; 
  15.   
  16.    String password() default "password"
  17.   
  18.    @AliasFor(annotation = WithSecurityContext.class) 
  19.    TestExecutionEvent setupBefore() default TestExecutionEvent.TEST_METHOD; 
  20.  

關(guān)鍵就在于@WithSecurityContext注解,我們只需要實(shí)現(xiàn)factory就行了,也就是:

  1. public interface WithSecurityContextFactory<A extends Annotation> { 
  2.   
  3.    SecurityContext createSecurityContext(A annotation); 

這里如法炮制就行,沒什么難度就不演示了。

總結(jié)

 

今天介紹了當(dāng)你的應(yīng)用中集成了Spring Security時(shí)如何單元測(cè)試,我們可以使用提供的模擬用戶的注解,也可以模擬加載用戶,甚至你可以根據(jù)自己的需要來定制化。其實(shí)如果你使用了JWT的話還有種野路子,你可以在Spring MVC Mock測(cè)試中加入對(duì)應(yīng)的請(qǐng)求頭或者參數(shù),也能順利進(jìn)行。

 

責(zé)任編輯:武曉燕 來源: 碼農(nóng)小胖哥
相關(guān)推薦

2021-04-19 07:33:04

WebSecuritySpringHttpSecurit

2021-01-28 09:50:29

分布式對(duì)象SharedObjec

2021-05-31 07:18:46

SpringSecurity信息

2013-06-04 09:49:04

Spring單元測(cè)試軟件測(cè)試

2019-11-22 09:40:40

SpringJava編程語(yǔ)言

2021-09-01 12:03:49

Spring單元測(cè)試

2021-08-29 18:36:57

項(xiàng)目

2022-11-26 00:00:02

2021-06-07 14:06:19

Spring SecuCSRF防御

2020-09-16 08:07:54

權(quán)限粒度Spring Secu

2023-04-10 11:41:15

2022-05-05 10:40:36

Spring權(quán)限對(duì)象

2009-06-18 14:18:23

Spring secu

2022-01-26 00:05:00

接口Spring管理器

2022-08-30 08:50:07

Spring權(quán)限控制

2022-08-15 08:42:46

權(quán)限控制Spring

2022-08-30 08:43:11

Spring權(quán)限控制

2022-08-30 08:36:13

Spring權(quán)限控制

2022-08-30 08:55:49

Spring權(quán)限控制

2022-06-16 10:38:24

URL權(quán)限源代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)