本文介紹了Spring安全-OAuth2資源服務器測試的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
使用@WebMvcTest和POST HTTP方法測試OAuth2資源服務器時遇到一些問題。
當我不發送CSRF令牌時,我總是收到403狀態代碼,即使在我使用承載令牌時不需要該令牌。
這是我要測試的POST方法。
@PostMapping("/message")
public String createMessage(@RequestBody String message) {
return String.format("Message was created. Content: %s", message);
}
這是我的安全配置:
http.authorizeRequests(authorizeRequests -> authorizeRequests
.antMatchers("/message/**")
.hasAuthority("SCOPE_message:read")
.anyRequest().authenticated()
).oauth2ResourceServer(oauth2ResourceServer ->
oauth2ResourceServer
.jwt(withDefaults())
);
我正在遵循spring-security的樣本中提供的測試。
以下測試應該通過,但失敗了,因為請求中沒有發送CSRF令牌。
mockMvc.perform(post("/message").content("Hello message")
.with(jwt(jwt -> jwt.claim("scope", "message:read")))
.andExpect(status().isOk())
.andExpect(content().string(is("Message was created. Content: Hello message")));
當我向請求添加CSRF令牌時,測試通過:
mockMvc.perform(post("/message").content("Hello message")
.with(jwt(jwt -> jwt.claim("scope", "message:read")))
.with(csrf()))
.andExpect(status().isOk())
.andExpect(content().string(is("Message was created. Content: Hello message")));
當我運行應用程序時,不需要在POST請求中發送CSRF令牌。
我已經派生了Spring Security GitHub存儲庫,具有此失敗測試的項目可以在link上找到。
有沒有辦法配置我的測試,使我不需要在POST請求中發送CSRF令牌?
推薦答案
為了使CSRF篩選器檢測到您正在使用JWT令牌,您需要將JWT令牌作為Authorization
頭或請求參數包括在請求中。
您提到的測試有一個模擬JwtDecoder
,這意味著您可以使用任何字符串作為令牌并模擬解碼值。
然后,您的測試將變為:
Jwt jwt = Jwt.withTokenValue("token")
.header("alg", "none")
.claim("scope", "message:read")
.build();
when(jwtDecoder.decode(anyString())).thenReturn(jwt);
mockMvc.perform(post("/message")
.content("Hello message")
.header("Authorization", "Bearer " + jwt.getTokenValue()))
.andExpect(status().isOk())
.andExpect(content().string(is("Message was created. Content: Hello message")));
如果您沒有模擬JwtDecoder
,則需要檢索有效的承載令牌并在Authorization
頭中傳遞該令牌。
這篇關于Spring安全-OAuth2資源服務器測試的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,