22. Anonymous Authentication(匿名認證)


22.1 Overview(概要)

 

采用“默認拒絕”通常被認為是良好的安全實踐,在這種情況下,您明確指定什么是允許的,什么是不允許的。定義未經身份驗證的用戶可以訪問的內容也是類似的情況,尤其是對於web應用程序。許多網站要求用戶必須通過除了幾個網址之外的任何東西的認證(例如主頁和登錄頁面)。在這種情況下,為這些特定的網址定義訪問配置屬性是最簡單的,而不是為每個受保護的資源定義。換句話說,有時候說ROLE_SOMETHING 是默認需要的,並且只允許這個規則的某些例外,比如應用程序的登錄、注銷和主頁。您也可以從篩選器鏈中完全省略這些頁面,從而繞過訪問控制檢查,但這可能是不可取的,因為其他原因,特別是如果頁面對經過身份驗證的用戶表現不同。

這就是我們所說的匿名認證。請注意,“匿名認證”用戶和未經認證的用戶之間沒有真正的概念上的區別。Spring Security的匿名身份驗證只是為您提供了一種更方便的方式來配置您的訪問控制屬性。例如,對諸如getCallerPrincipal之類的servlet應用編程接口調用仍將返回空值,即使在SecurityContextHolder中實際上有一個匿名身份驗證對象。

在其他情況下,匿名身份驗證是有用的,例如當審核攔截器查詢SecurityContextHolder以確定哪個主體負責給定的操作時。如果類知道SecurityContextHolder總是包含一個身份驗證對象,並且從不為空,那么它們可以被更健壯地創作。

 22.2 Configuration(配置)

匿名身份驗證支持在使用超文本傳輸協議配置Spring Security 3.0時自動提供,並且可以使用<anonymous>元素進行自定義(或禁用)。除非使用傳統的bean配置,否則不需要配置這里描述的bean。

三個類一起提供匿名身份驗證功能。匿名用戶身份驗證令牌(AnonymousAuthenticationToken )是身份驗證(Authentication)的一種實現,它存儲應用於匿名主體的授權。有一個相應的匿名用戶身份驗證提供程序(AnonymousAuthenticationProvider),它被鏈接到提供程序管理器(ProviderManager )中,以便接受匿名用戶身份驗證令牌(AnonymousAuthenticationToken )。最后,還有一個AnonymousAuthenticationFilter,它鏈接在正常的身份驗證機制之后,如果沒有現有的身份驗證,它會自動將AnonymousAuthenticationToken添加到SecurityContextHolder中。篩選器和身份驗證提供程序的定義如下所示:

 


 

該密鑰在過濾器和認證提供者之間共享,因此前者創建的令牌被后者接受[18]。用戶屬性以用戶名的形式表示在usernameInTheAuthenticationToken,grantedAuthority[,grantedAuthority]。這與在InMemoryDaoImpl的userMap屬性的等號后面使用的語法相同。

如前所述,匿名身份驗證的好處是所有URI模式都可以應用安全性。例如:

 

22.3 AuthenticationTrustResolver(身份驗證信任解決方案)

 

匿名身份驗證討論的另一個方面是身份驗證身份驗證解析器接口(AuthenticationTrustResolver )及其相應的身份驗證身份驗證身份驗證解析器(AuthenticationTrustResolverImpl)實現。這個接口提供了一個身份驗證方法(isAnonymous(Authentication)),它允許感興趣的類考慮這種特殊類型的身份驗證狀態。異常轉換篩選器(ExceptionTranslationFilter )在處理訪問拒絕異常(AccessDeniedException )時使用此接口。如果引發了一個AccessDeniedException,並且身份驗證是匿名類型的,則過濾器將改為啟動AuthenticationEntryPoint,以便主體可以正確地進行身份驗證,而不是引發403(禁止的)響應。這是一個必要的區別,否則主體將總是被認為是“已認證的”,並且永遠沒有機會通過表單、基本、摘要或一些其他正常的認證機制登錄。

您經常會看到上面攔截器配置中的ROLE_ANONYMOUS屬性被替換為IS _ AUTHORITY _ ANONYMOUS,這在定義訪問控制時實際上是一回事。這是使用授權投票者(AuthenticatedVoter )的一個例子,我們將在授權一章中看到。它使用身份驗證信任解析器(AuthenticationTrustResolver )來處理這個特定的配置屬性,並向匿名用戶授予訪問權限。認證投票者(AuthenticatedVoter )方法更強大,因為它允許您區分匿名、記住我和完全認證的用戶。如果您不需要這個功能,那么您可以繼續使用角色匿名(ROLE_ANONYMOUS),它將由Spring Security的標准角色投票器處理。

密鑰屬性的使用不應被視為提供任何真正的安全性。這只是一個記賬練習。如果您共享一個包含匿名用戶身份驗證提供程序的提供程序管理器,在這種情況下,身份驗證客戶端可能會構建身份驗證對象(例如通過RMI調用),那么惡意客戶端可能會提交它自己創建的匿名用戶身份驗證令牌(帶有選定的用戶名和授權列表)。如果密鑰是可猜測的或者可以被發現,那么令牌將被匿名提供者接受。這對於正常使用來說不是問題,但是如果您正在使用RMI,您最好使用一個定制的提供者管理器,它省略了匿名提供者,而不是共享您用於您的超文本傳輸協議認證機制的提供者。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM