對(duì)于匿名訪問(wèn)的用戶,Spring Security 支持為其建立一個(gè)匿名的 AnonymousAuthenticationToken 存放在 SecurityContextHolder 中,這就是所謂的匿名認(rèn)證。這樣在以后進(jìn)行權(quán)限認(rèn)證或者做其它操作時(shí)我們就不需要再判斷 SecurityContextHolder 中持有的 Authentication 對(duì)象是否為 null 了,而直接把它當(dāng)做一個(gè)正常的 Authentication 進(jìn)行使用就 OK 了。
使用 NameSpace 時(shí),http 元素的使用默認(rèn)就會(huì)啟用對(duì)匿名認(rèn)證的支持,不過(guò)我們也可以通過(guò)設(shè)置 http 元素下的 anonymous 元素的 enabled 屬性為 false 停用對(duì)匿名認(rèn)證的支持。以下是 anonymous 元素可以配置的屬性,以及它們的默認(rèn)值。
<security:anonymous enabled="true" key="doesNotMatter" username="anonymousUser" granted-authority="ROLE_ANONYMOUS"/>
key 用于指定一個(gè)在 AuthenticationFilter 和 AuthenticationProvider 之間共享的值。username 用于指定匿名用戶所對(duì)應(yīng)的用戶名,granted-authority 用于指定匿名用戶所具有的權(quán)限。
與匿名認(rèn)證相關(guān)的類有三個(gè),AnonymousAuthenticationToken 將作為一個(gè) Authentication 的實(shí)例存放在 SecurityContextHolder 中;過(guò)濾器運(yùn)行到 AnonymousAuthenticationFilter 時(shí),如果 SecurityContextHolder 中持有的 Authentication 還是空的,則 AnonymousAuthenticationFilter 將創(chuàng)建一個(gè) AnonymousAuthenticationToken 并存放在 SecurityContextHolder 中。最后一個(gè)相關(guān)的類是 AnonymousAuthenticationProvider,其會(huì)添加到 ProviderManager 的 AuthenticationProvider 列表中,以支持對(duì) AnonymousAuthenticationToken 的認(rèn)證。AnonymousAuthenticationToken 的認(rèn)證是在 AbstractSecurityInterceptor 中的 beforeInvocation() 方法中進(jìn)行的。使用 http 元素定義時(shí)這些 bean 都是會(huì)自動(dòng)定義和添加的。如果需要手動(dòng)定義這些 bean 的話,那么可以如下定義:
<bean id="anonymousAuthFilter"
class="org.springframework.security.web.authentication.AnonymousAuthenticationFilter">
<property name="key" value="doesNotMatter" />
<property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS" />
</bean>
<bean id="anonymousAuthenticationProvider"
class="org.springframework.security.authentication.AnonymousAuthenticationProvider">
<property name="key" value="doesNotMatter" />
</bean>
key 是在 AnonymousAuthenticationProvider 和 AnonymousAuthenticationFilter 之間共享的,它們必須保持一致,AnonymousAuthenticationProvider 將使用本身?yè)碛械?key 與傳入的 AnonymousAuthenticationToken 的 key 作比較,相同則認(rèn)為可以進(jìn)行認(rèn)證,否則將拋出異常 BadCredentialsException。userAttribute 屬性是以 usernameInTheAuthenticationToken,grantedAuthority[,grantedAuthority] 的形式進(jìn)行定義的。
AuthenticationTrustResolver 是一個(gè)接口,其中定義有兩個(gè)方法,isAnonymous() 和 isRememberMe(),它們都接收一個(gè) Authentication 對(duì)象作為參數(shù)。它有一個(gè)默認(rèn)實(shí)現(xiàn)類 AuthenticationTrustResolverImpl,Spring Security 就是使用它來(lái)判斷一個(gè) SecurityContextHolder 持有的 Authentication 是否 AnonymousAuthenticationToken 或 RememberMeAuthenticationToken。如當(dāng) ExceptionTranslationFilter 捕獲到一個(gè) AccessDecisionManager 后就會(huì)使用它來(lái)判斷當(dāng)前 Authentication 對(duì)象是否為一個(gè) AnonymousAuthenticationToken,如果是則交由 AuthenticationEntryPoint 處理,否則將返回 403 錯(cuò)誤碼。
更多建議: