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

Spring 原始碼解析(九):Spring Security (Acegi) 認證機制深度剖析

     編輯:Java 相關知識

認證入口:AuthenticationProcessingFilter

繼承 AbstractProcessingFilter,doFilter() 攔截 HTTP 請求,判斷 requiresAuthentication()(預設匹配登入 URL)。需認證時呼叫 attemptAuthentication():

  1. 從請求取得帳號密碼 obtainUsername/password()。
  2. 建構 UsernamePasswordAuthenticationToken(未認證的 Authentication 實作)。
  3. 委派 AuthenticationManager.authenticate() 執行認證。

成功呼叫 successfulAuthentication()(通常重導向),失敗呼叫 unsuccessfulAuthentication()。

AuthenticationManager 與 ProviderManager

AbstractAuthenticationManager.authenticate() 模板方法呼叫 doAuthentication()。ProviderManager 維護 AuthenticationProvider 鏈:

  • 遍歷 Provider,supports() 檢查支援的 Authentication 類型。
  • 呼叫 provider.authenticate(),成功發布 AuthenticationSuccessEvent 並返回;失敗記錄異常繼續下一 Provider。
  • 全失敗拋出 ProviderNotFoundException 或最後異常。

DaoAuthenticationProvider:資料庫認證核心

繼承 AbstractUserDetailsAuthenticationProvider,流程:

  1. 取得使用者名稱,嘗試從快取 (UserCache) 獲取 UserDetails。
  2. 快取未命中,呼叫 retrieveUser() → 委派 UserDetailsService.loadUserByUsername() 從資料庫載入。
  3. 檢查帳號狀態:鎖定、停用、過期、憑證過期。
  4. 呼叫 additionalAuthenticationChecks() 比對密碼(支援 PasswordEncoder 加鹽雜湊)。
  5. 成功將 UserDetails 存入快取,建構含權限的 Authentication 返回。

JdbcDaoImpl:JDBC 實作 UserDetailsService

預設 SQL:

SELECT username,password,enabled FROM users WHERE username = ?
SELECT username,authority FROM authorities WHERE username = ?

使用 Spring MappingSqlQuery 將 ResultSet 映射為 GrantedAuthority 與 User 物件。loadUserByUsername() 合併查詢結果構建完整 UserDetails。

密碼比對細節

protected void additionalAuthenticationChecks(UserDetails user, UsernamePasswordAuthenticationToken auth) {
    String presented = auth.getCredentials().toString();
    if (!passwordEncoder.isPasswordValid(user.getPassword(), presented, salt))
        throw new BadCredentialsException(...);
}

支援 SaltSource 取得鹽值,PasswordEncoder 驗證雜湊密碼。

總結

認證流程:AuthenticationProcessingFilter 攔截 → 建構 Token → ProviderManager 遍歷 Provider → DaoAuthenticationProvider 透過 UserDetailsService (如 JdbcDaoImpl) 載入使用者資料 → 狀態檢查 → 密碼編碼比對 → 產出含權限的 Authentication 供後續授權使用。架構靈活支援多種認證來源與編碼策略。

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