首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Acegi AnonymousProcessingFilter 匿名訪問機制解析

     編輯:Java 相關知識

AnonymousProcessingFilter 為未認證請求建立匿名 Authentication,使「公開資源」也能納入統一權限決策流程,避免在配置檔硬編碼排除 URL。

一、為什麼需要匿名 Authentication?

  • 理論完整性:所有請求皆有 Authentication 物件,FilterSecurityInterceptor 統一決策。
  • 動態權限:原本公開的 URL 後續需加權限,只需調整 AccessDecisionVoter 配置,無需修改 Filter 鏈。
  • 程式碼簡化:Controller 中可直接 SecurityContextHolder.getContext().getAuthentication() 取得 Principal,無需判斷 null。

二、核心三類

  1. AnonymousProcessingFilter:產生 AnonymousAuthenticationToken 放入 SecurityContext。
  2. AnonymousAuthenticationToken:實作 Authentication,攜帶 ROLE_ANONYMOUS 權限。
  3. AnonymousAuthenticationProvider:驗證 Token,提供「自己人」投票通過。

三、Bean 配置

<bean id="anonymousProcessingFilter"
      class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
    <property name="key" value="anonymous"/>
    <property name="userAttribute" value="anonymous,ROLE_ANONYMOUS"/>
</bean>

<bean id="anonymousAuthenticationProvider"
      class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">
    <property name="key" value="anonymous"/> <-- 必須與 Filter key 一致 -->
</bean>

<!-- 註冊 Provider -->
<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
    <property name="providers">
        <list>
            <ref bean="daoAuthenticationProvider"/>
            <ref bean="rememberMeAuthenticationProvider"/>
            <ref bean="anonymousAuthenticationProvider"/>
        </list>
    </property>
</bean>

四、Filter 鏈位置

/**=httpSessionContextIntegrationFilter,
   logoutFilter,
   authenticationProcessingFilter,
   rememberMeProcessingFilter,
   anonymousProcessingFilter,  <-- 處理未認證請求
   exceptionTranslationFilter,
   filterInvocationInterceptor

五、key 一致性驗證

文件明確指出:「The key is shared between the filter and authentication provider, so that tokens created by the former are accepted by the latter.」若 key 不同,Provider 會拒絕 Token,導致匿名請求被視為未認證而拋出 AccessDeniedException。

六、AuthenticationTrustResolver 補充

ExceptionTranslationFilter 利用 AuthenticationTrustResolver.isAnonymous() 判斷:若匿名用戶存取受保護資源,導向登入頁而非直接 403,給予登入機會。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved