成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[395171]]

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

Spring Security 測試環(huán)境

要想在單元測試中使用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> 

 

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

Spring Security 測試

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

@WithMockUser

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

  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è)測試類上,這樣每個(gè)測試都將使用指定該用戶。

@WithAnonymousUser

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

@WithUserDetails

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

  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í)行單元測試時(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í)如何單元測試,我們可以使用提供的模擬用戶的注解,也可以模擬加載用戶,甚至你可以根據(jù)自己的需要來定制化。其實(shí)如果你使用了JWT的話還有種野路子,你可以在Spring MVC Mock測試中加入對(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單元測試軟件測試

2019-11-22 09:40:40

SpringJava編程語言

2021-09-01 12:03:49

Spring單元測試

2021-08-29 18:36:57

項(xiàng)目

2021-06-07 14:06:19

Spring SecuCSRF防御

2022-11-26 00:00:02

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ì)象

2022-08-30 08:50:07

Spring權(quán)限控制

2009-06-18 14:18:23

Spring secu

2022-01-26 00:05:00

接口Spring管理器

2022-08-15 08:42:46

權(quán)限控制Spring

2022-08-30 08:36:13

Spring權(quán)限控制

2022-08-30 08:55:49

Spring權(quán)限控制

2022-08-30 08:43:11

Spring權(quán)限控制

2022-08-15 08:45:21

Spring權(quán)限控制
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 亚洲美女一区 | 伊人二区| 91人人看 | 91在线视频观看 | 国产一级淫片免费视频 | 日韩在线不卡 | 久久国产精品久久久久久 | 最新国产视频 | 日韩在线免费电影 | 国产日韩视频在线 | 日本久久精品视频 | 国产成视频在线观看 | 91av久久久| 久久精品免费看 | 欧美福利| caoporn视频| 亚洲精品综合一区二区 | 国产精品99久久久久久www | 一级特黄a大片 | 在线看成人av | 亚洲一区二区在线视频 | 日本亚洲精品成人欧美一区 | 日韩av在线一区 | 亚洲视频三区 | 在线视频 亚洲 | 欧美激情久久久 | 欧美午夜视频 | 丝袜毛片 | 在线观看国产精品视频 | 九九免费观看视频 | 日韩在线看片 | 精品1区| 视频一区中文字幕 | 中文成人在线 | 五月婷婷在线视频 | 日韩国产黄色片 | 国产乡下妇女做爰 | 成人在线免费网站 | 一区二区av | 久在线| 久久亚洲一区二区三区四区 |