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

Acegi 七劍下天山:核心組件與請求處理流程圖解

     編輯:Java 相關知識

Acegi 核心實現圍繞「七劍」展開,本文結合靜態 Bean 圖與動態序列圖,完整追蹤請求如何穿越 Filter 鏈並完成認證授權。

一、七劍核心組件

  1. SecurityContextHolder:線程級安全上下文持有者。
  2. SecurityContext:封裝 Authentication。
  3. HttpSessionContextIntegrationFilter:Session ↔ Context 同步。
  4. Authentication:主體身份與憑證封裝。
  5. GrantedAuthority:權限標識 (如 ROLE_USER)。
  6. UserDetails:用戶詳細資訊載體。
  7. UserDetailsService:載入用戶資料的服務介面。

二、Filter 鏈配置

<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
    <property name="filterInvocationDefinitionSource">
        <value>
            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
            PATTERN_TYPE_APACHE_ANT
            /login.jsp=#NONE#
            /**=httpSessionContextIntegrationFilter,
               authenticationProcessingFilter,
               exceptionTranslationFilter,
               filterInvocationInterceptor
        </value>
    </property>
</bean>

三、請求處理序列

  1. FilterChainProxy 根據路徑匹配選擇 Filter 鏈。
  2. HttpSessionContextIntegrationFilter:從 Session 取得/建立 SecurityContext → 存入 SecurityContextHolder → chain.doFilter()。
  3. AuthenticationProcessingFilter:
    • requiresAuthentication() 檢測是否為登入請求 (j_acegi_security_check)。
    • 提取 username/password → 建立 UsernamePasswordAuthenticationToken。
    • authenticationManager.authenticate() 驗證。
    • 成功:SecurityContextHolder.getContext().setAuthentication()、重導向 defaultTargetUrl。
    • 失敗:捕獲 AuthenticationException → 重導向 authenticationFailureUrl。
  4. ExceptionTranslationFilter / FilterSecurityInterceptor:
    • 從 SecurityContext 取得 Authentication。
    • AccessDecisionManager 決策:遍歷 ConfigAttributeDefinition 所需角色,與 Authentication.getAuthorities() 比對。
    • 通過 → 放行;拒絕 → 拋出 AccessDeniedException → ExceptionTranslationFilter 處理。

四、七劍在授權環節的協作

// FilterSecurityInterceptor 內部
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
GrantedAuthority[] userAuths = auth.getAuthorities();           // 劍4
UserDetails user = userDetailsService.loadUserByUsername(auth.getName()); // 劍6,7
GrantedAuthority[] requiredAuths = configAttributes.getAuthorities();     // 配置需求
// AccessDecisionVoter 比對 userAuths 與 requiredAuths

五、動態調用圖關鍵點

  • FilterChainProxy.doFilter() → VirtualFilterChain.doFilter() 遞迴調用下一 Filter。
  • 各 Filter 持有 FilterChain 參數,決定是否 chain.doFilter() 放行或自行回應。
  • AuthenticationManager (ProviderManager) 委派給 AuthenticationProvider 驗證,支援多 Provider 鏈。

六、總結

「七劍」是 Acegi 不變的核心,Filter 鏈與配置是針對不同場景的組裝方式。理解七劍職責與協作,即可靈活擴充、排錯。

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