Spring Security FilterChain 如何進行登入認證
進行 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 架構流程。
參考資料:
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Sean's Blog!
評論
GiscusDisqus