進行 Spring Security 的實作時碰到很多底層運行架構不是很了解的狀況,上網查找一些資訊拼湊出一個比較容易理解的流程。主要是針對帳號密碼登入時的授權部分,因為牽涉到很多元件的運作,所以需要整理一下。

帳號密碼認證流程

認證和授權動作都是在請求到達 Spring MVC 的運作之前,Security 就已經透過一套機制進行一系列的驗證,首先會先碰到的就是

  • (1) Filter Chain 的系統,這邊會透過一系列的過濾篩選,只要請求的一些 header 或是任何內容有不符合的就會先被過濾掉,算是攔截器的概念,層層篩選其中關於登入的部分會由 UsernamePasswordAuthenticationFilter 進行處理,接著會被導入
  • (2) Authentication Manager 統一針對授權去管理,從一堆 Provider 中找到一個可以成功認證的
  • (3) Authentication Provider 來判斷帳號密碼是否正確,密碼的加密及認證等等處理 (配置密碼加密的類型 PasswordEncoder 也是從這邊設置),他會從 UserDetailService 這個介面取出對應的 User 並且結合其他資訊封裝成 UserDetails (使用者相關資訊、權限…) 這個 Security 所使用的使用者資訊界面物件,然後交由
  • (4) Authentication Provider 使用進行驗證,
  • (5) (6) 如果驗證成功就會產生一個 已驗證的 Authentication 物件存於 Security Context ,這位置預設保存在 Session ,所以 Authentication 會和 Session 綁訂,後續請求也都可以重複取出使用,不必重新驗證。如果失敗就拋出例外回前端。
  • 成功的話 (7) 接著就會將請求導入後續我們熟悉的 MVC 架構流程。

https://ithelp.ithome.com.tw/upload/images/20240914/201509773bAvCQLiQT.png


參考資料: