開課吧Web3.0應用工程師培養(yǎng)計劃2022最新-大江茫茫去不還
使用Spring Security REST服務(wù)的基本/摘要認證
開課吧Web3.0應用工程師培養(yǎng)計劃2022最新
download:https://www.zxit666.com/5408/
本文討論如何在REST API的同一個URI結(jié)構(gòu)上設(shè)置基本身份驗證和摘要式身份驗證。在上一篇文章中,我們討論了保護REST服務(wù)的另一種方法——基于表單的身份驗證,因此基本身份驗證和摘要式身份驗證是自然的選擇,也是更RESTful的身份驗證方法。
的基本身份驗證配置
基于表單的認證不適合RESTful服務(wù)的主要原因是Spring Security會使用會話——這當然是服務(wù)器上的狀態(tài),所以REST中的無狀態(tài)約束幾乎被忽略。
首先,我們設(shè)置基本身份驗證——首先,我們從主要安全元素中刪除舊的自定義入口點和過濾器
注意如何用一個配置行添加對基本身份驗證的支持——它處理BasicAuthenticationFilter和BasicAuthenticationEntryPoint的創(chuàng)建和連接。
滿足無狀態(tài)約束——擺脫會話
RESTful架構(gòu)風格的一個主要限制是客戶端-服務(wù)器通信是完全無狀態(tài)的,如原文所示:
5.1.3無狀態(tài):接下來,我們給客戶端-服務(wù)器交互添加一個約束:通信本質(zhì)上必須是無狀態(tài)的,比如3.4.3節(jié)中的客戶端無狀態(tài)服務(wù)器(CSS)風格(圖5-3),這樣從客戶端到服務(wù)器的每個請求都必須包含理解請求所需的所有信息,并且不能利用服務(wù)器上任何存儲的上下文。因此,會話狀態(tài)完全保留在客戶端上。
server上的Session這個概念在Spring Security中由來已久,直到現(xiàn)在也沒有被完全刪除,尤其是使用namespace完成配置的時候。
然而,Spring Security用一個新的無狀態(tài)選項增強了名稱空間配置,這有效地保證了Spring不會創(chuàng)建或使用任何會話。這個新選項的作用是從安全過濾器鏈中刪除所有與會話相關(guān)的過濾器,并確保每個請求都經(jīng)過身份驗證。
摘要式身份驗證的配置
從前面的配置開始,設(shè)置摘要式身份驗證所需的過濾器和入口點將被定義為bean。然后,摘要入口點將覆蓋由幕后創(chuàng)建的入口點。最后,將使用安全名稱空間的語義在安全過濾器鏈中引入一個定制的摘要過濾器,以直接在它之后定位基本身份驗證過濾器。
" org . spring framework . security . web . authentic ation . www . digestauthenticationfilter " >
" org . spring framework . security . web . authentic ation . www . digestauthenticationentrypoint " >
復制代碼
遺憾的是,安全命名空間不支持摘要式身份驗證的自動配置,這與使用配置基本身份驗證是一樣的。因此,必須手動定義必要的bean并將其連接到安全配置。
在同一個RESTful服務(wù)中支持兩種身份驗證協(xié)議。
只有在Spring Security中才能輕松實現(xiàn)基本或摘要式身份驗證;它支持相同的RESTful Web服務(wù),并在相同的URI映射上引入了新的服務(wù)配置和測試復雜性。
匿名請求
通過安全鏈中的基本過濾器和摘要過濾器,Spring Security處理匿名請求(沒有身份驗證憑證(授權(quán)HTTP頭)的請求)時,兩個身份驗證過濾器不會找到憑證,而是繼續(xù)執(zhí)行過濾鏈。然后,檢查請求未被認證的方式,拋出AccessDeniedException并在ExceptionTranslationFilter中捕獲它,這將啟動摘要入口點并提示客戶端提供憑據(jù)。
摘要過濾器的范圍非常窄——如果它們不能識別請求中的身份驗證憑證類型,它們將繼續(xù)執(zhí)行安全過濾器鏈。正因為如此,Spring Security可以靈活地配置,以便在同一個URI上支持多個身份驗證協(xié)議。
當請求包含正確的身份驗證憑據(jù)(基本或摘要)時,將正確使用此協(xié)議。但是,對于匿名請求,只會提示客戶端提取摘要式身份驗證憑據(jù)。這是因為摘要入口點被配置為Spring安全鏈的主要和單一入口點;因為這樣的摘要認證可以被認為是默認的。
請求身份驗證憑據(jù)
具有基本身份驗證憑據(jù)的請求將由以“Basic”前綴開頭的授權(quán)頭來標識。當處理這樣的請求時,憑證將在基本認證過濾器中被解碼,并且請求將被授權(quán)。同樣,具有摘要式身份驗證憑據(jù)的請求將使用前綴“Digest”作為其授權(quán)頭。
測試兩個案例。
使用basic或Digest進行身份驗證后,測試將通過創(chuàng)建新資源來使用REST服務(wù):
@測試
public void givenuthenticatedbybasicauth _ wharesourceiscreated _ then 201 is received(){
//給定
//何時
響應響應=給定()
。auth()。搶先()?;?管理員用戶名、管理員密碼)
。contentType( HttpConstants。MIME_JSON)。body( new Foo( randomAlphabetic( 6)))
。post(paths . getfoourl());
//然后
assertThat(response . getstatuscode(),is(201));
}
@測試
public void givenuthenticatedbydigestauth _ wharesourceiscreated _ then 201 is received(){
//給定
//何時
響應響應=給定()
。auth()。摘要(管理員用戶名、管理員密碼)
。contentType( HttpConstants。MIME_JSON)。body( new Foo( randomAlphabetic( 6)))
。post(paths . getfoourl());
//然后
assertThat(response . getstatuscode(),is(201));
}
復制代碼
請注意,使用基本身份驗證的測試會先發(fā)制人地將憑證添加到請求中,而不管服務(wù)器是否已經(jīng)過身份驗證。這是為了確保服務(wù)器不需要從客戶端請求憑證,因為這樣將使用摘要憑證,這是默認值。
案件結(jié)論
本文介紹了RESTful服務(wù)的基本認證和摘要認證的配置和實現(xiàn),主要使用了Spring安全命名空間支持和框架中的一些新功能。