22. Anonymous Authentication(匿名认证)
22.1Overview(概要)
采用“默認(rèn)拒絕”通常被認(rèn)為是良好的安全實(shí)踐,在這種情況下,您明確指定什么是允許的,什么是不允許的。定義未經(jīng)身份驗(yàn)證的用戶可以訪問的內(nèi)容也是類似的情況,尤其是對(duì)于web應(yīng)用程序。許多網(wǎng)站要求用戶必須通過除了幾個(gè)網(wǎng)址之外的任何東西的認(rèn)證(例如主頁(yè)和登錄頁(yè)面)。在這種情況下,為這些特定的網(wǎng)址定義訪問配置屬性是最簡(jiǎn)單的,而不是為每個(gè)受保護(hù)的資源定義。換句話說(shuō),有時(shí)候說(shuō)ROLE_SOMETHING是默認(rèn)需要的,并且只允許這個(gè)規(guī)則的某些例外,比如應(yīng)用程序的登錄、注銷和主頁(yè)。您也可以從篩選器鏈中完全省略這些頁(yè)面,從而繞過訪問控制檢查,但這可能是不可取的,因?yàn)槠渌颍貏e是如果頁(yè)面對(duì)經(jīng)過身份驗(yàn)證的用戶表現(xiàn)不同。
這就是我們所說(shuō)的匿名認(rèn)證。請(qǐng)注意,“匿名認(rèn)證”用戶和未經(jīng)認(rèn)證的用戶之間沒有真正的概念上的區(qū)別。Spring Security的匿名身份驗(yàn)證只是為您提供了一種更方便的方式來(lái)配置您的訪問控制屬性。例如,對(duì)諸如getCallerPrincipal之類的servlet應(yīng)用編程接口調(diào)用仍將返回空值,即使在SecurityContextHolder中實(shí)際上有一個(gè)匿名身份驗(yàn)證對(duì)象。
在其他情況下,匿名身份驗(yàn)證是有用的,例如當(dāng)審核攔截器查詢SecurityContextHolder以確定哪個(gè)主體負(fù)責(zé)給定的操作時(shí)。如果類知道SecurityContextHolder總是包含一個(gè)身份驗(yàn)證對(duì)象,并且從不為空,那么它們可以被更健壯地創(chuàng)作。
22.2 Configuration(配置)
匿名身份驗(yàn)證支持在使用超文本傳輸協(xié)議配置Spring Security 3.0時(shí)自動(dòng)提供,并且可以使用<anonymous>元素進(jìn)行自定義(或禁用)。除非使用傳統(tǒng)的bean配置,否則不需要配置這里描述的bean。
三個(gè)類一起提供匿名身份驗(yàn)證功能。匿名用戶身份驗(yàn)證令牌(AnonymousAuthenticationToken)是身份驗(yàn)證(Authentication)的一種實(shí)現(xiàn),它存儲(chǔ)應(yīng)用于匿名主體的授權(quán)。有一個(gè)相應(yīng)的匿名用戶身份驗(yàn)證提供程序(AnonymousAuthenticationProvider),它被鏈接到提供程序管理器(ProviderManager)中,以便接受匿名用戶身份驗(yàn)證令牌(AnonymousAuthenticationToken)。最后,還有一個(gè)AnonymousAuthenticationFilter,它鏈接在正常的身份驗(yàn)證機(jī)制之后,如果沒有現(xiàn)有的身份驗(yàn)證,它會(huì)自動(dòng)將AnonymousAuthenticationToken添加到SecurityContextHolder中。篩選器和身份驗(yàn)證提供程序的定義如下所示:
該密鑰在過濾器和認(rèn)證提供者之間共享,因此前者創(chuàng)建的令牌被后者接受[18]。用戶屬性以用戶名的形式表示在usernameInTheAuthenticationToken,grantedAuthority[,grantedAuthority]。這與在InMemoryDaoImpl的userMap屬性的等號(hào)后面使用的語(yǔ)法相同。
如前所述,匿名身份驗(yàn)證的好處是所有URI模式都可以應(yīng)用安全性。例如:
22.3 AuthenticationTrustResolver(身份驗(yàn)證信任解決方案)
匿名身份驗(yàn)證討論的另一個(gè)方面是身份驗(yàn)證身份驗(yàn)證解析器接口(AuthenticationTrustResolver)及其相應(yīng)的身份驗(yàn)證身份驗(yàn)證身份驗(yàn)證解析器(AuthenticationTrustResolverImpl)實(shí)現(xiàn)。這個(gè)接口提供了一個(gè)身份驗(yàn)證方法(isAnonymous(Authentication)),它允許感興趣的類考慮這種特殊類型的身份驗(yàn)證狀態(tài)。異常轉(zhuǎn)換篩選器(ExceptionTranslationFilter)在處理訪問拒絕異常(AccessDeniedException)時(shí)使用此接口。如果引發(fā)了一個(gè)AccessDeniedException,并且身份驗(yàn)證是匿名類型的,則過濾器將改為啟動(dòng)AuthenticationEntryPoint,以便主體可以正確地進(jìn)行身份驗(yàn)證,而不是引發(fā)403(禁止的)響應(yīng)。這是一個(gè)必要的區(qū)別,否則主體將總是被認(rèn)為是“已認(rèn)證的”,并且永遠(yuǎn)沒有機(jī)會(huì)通過表單、基本、摘要或一些其他正常的認(rèn)證機(jī)制登錄。
您經(jīng)常會(huì)看到上面攔截器配置中的ROLE_ANONYMOUS屬性被替換為IS _ AUTHORITY _ ANONYMOUS,這在定義訪問控制時(shí)實(shí)際上是一回事。這是使用授權(quán)投票者(AuthenticatedVoter)的一個(gè)例子,我們將在授權(quán)一章中看到。它使用身份驗(yàn)證信任解析器(AuthenticationTrustResolver)來(lái)處理這個(gè)特定的配置屬性,并向匿名用戶授予訪問權(quán)限。認(rèn)證投票者(AuthenticatedVoter)方法更強(qiáng)大,因?yàn)樗试S您區(qū)分匿名、記住我和完全認(rèn)證的用戶。如果您不需要這個(gè)功能,那么您可以繼續(xù)使用角色匿名(ROLE_ANONYMOUS),它將由Spring Security的標(biāo)準(zhǔn)角色投票器處理。
密鑰屬性的使用不應(yīng)被視為提供任何真正的安全性。這只是一個(gè)記賬練習(xí)。如果您共享一個(gè)包含匿名用戶身份驗(yàn)證提供程序的提供程序管理器,在這種情況下,身份驗(yàn)證客戶端可能會(huì)構(gòu)建身份驗(yàn)證對(duì)象(例如通過RMI調(diào)用),那么惡意客戶端可能會(huì)提交它自己創(chuàng)建的匿名用戶身份驗(yàn)證令牌(帶有選定的用戶名和授權(quán)列表)。如果密鑰是可猜測(cè)的或者可以被發(fā)現(xiàn),那么令牌將被匿名提供者接受。這對(duì)于正常使用來(lái)說(shuō)不是問題,但是如果您正在使用RMI,您最好使用一個(gè)定制的提供者管理器,它省略了匿名提供者,而不是共享您用于您的超文本傳輸協(xié)議認(rèn)證機(jī)制的提供者。
總結(jié)
以上是生活随笔為你收集整理的22. Anonymous Authentication(匿名认证)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 列宽一字符等于多少厘米_字符串匹配算法总
- 下一篇: flash写保护原理_为什么固态会掉盘?