鍍金池/ 教程/ Java/ 匿名認(rèn)證
初體驗(yàn)
權(quán)限鑒定基礎(chǔ)
Remember-Me 功能
匿名認(rèn)證
intercept-url配置
認(rèn)證簡(jiǎn)介
退出登錄 logout
AuthenticationProvider
Filter
關(guān)于登錄
異常信息本地化
緩存 UserDetails
session 管理
核心類簡(jiǎn)介

匿名認(rèn)證

對(duì)于匿名訪問的用戶,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)證的支持,不過我們也可以通過設(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 中;過濾器運(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 將使用本身擁有的 key 與傳入的 AnonymousAuthenticationToken 的 key 作比較,相同則認(rèn)為可以進(jìn)行認(rèn)證,否則將拋出異常 BadCredentialsException。userAttribute 屬性是以 usernameInTheAuthenticationToken,grantedAuthority[,grantedAuthority] 的形式進(jìn)行定義的。

AuthenticationTrustResolver

AuthenticationTrustResolver 是一個(gè)接口,其中定義有兩個(gè)方法,isAnonymous() 和 isRememberMe(),它們都接收一個(gè) Authentication 對(duì)象作為參數(shù)。它有一個(gè)默認(rèn)實(shí)現(xiàn)類 AuthenticationTrustResolverImpl,Spring Security 就是使用它來判斷一個(gè) SecurityContextHolder 持有的 Authentication 是否 AnonymousAuthenticationToken 或 RememberMeAuthenticationToken。如當(dāng) ExceptionTranslationFilter 捕獲到一個(gè) AccessDecisionManager 后就會(huì)使用它來判斷當(dāng)前 Authentication 對(duì)象是否為一個(gè) AnonymousAuthenticationToken,如果是則交由 AuthenticationEntryPoint 處理,否則將返回 403 錯(cuò)誤碼。

上一篇:session 管理下一篇:AuthenticationProvider