Spring Security 認證流程詳解

1、認證流程說明

Spring Security實際上是通過一組過濾器鏈來對請求進行攔截操作的,如下圖所示:

Spring Security過濾器鏈

       其中UsernamePasswordAuthenticationFilter和BasicAuthenticationFilter是兩個核心過濾器。而FilterSecurityInterceptor會對之前這些核心過濾器進行相應判斷,並拋出異常(例如身份認證沒有通過)。然後由ExceptionTranslationFilter捕獲拋出來的異常,進行相應處理。

2. 用戶登錄認證流程

用戶登錄認證流程

     本系統通過setFilterProcessesUrl("/login/auth")設置該過濾器訪問地址,然後客戶端登錄界面先提交數據到後端進行數據校驗(Spring Validation),校驗無誤後再提交登錄信息到本過濾器。 UsernamePasswordAuthenticationFilter接着獲取客戶的Username和Password將其封裝成UsernamePasswordAuthenticationToken對象(Authentication的一個實現類),這個對象中封裝了我們需要認證的信息。之後通過調用AuthenticationManager的authenticate方法進行認證。然而實際上認證並不是由AuthenticationManager做的,而是由AuthenticationProvider去實現的,AuthenticationManager的作用是管理一組AuthenticationProvider集合,通過for循環遍歷的方式去尋找合適的Provider。這裏AuthenticationManager調用DaoAuthenticationProvider去認證。

DaoAuthenticationProvider的類圖

     DaoAuthenticationProvider通過調用UserDetailsService的loadUserByUsername方法來獲取UserDetails對象。然後比對UserDetails的密碼與認證請求的密碼是否一致,一致則表示認證通過。在認證成功以後會使用加載的UserDetails(包含用戶權限等信息)來封裝要返回的Authentication對象,並保存在SecurityContextHolder所持有的SecurityContext中,供後續的程序進行調用,如訪問權限的鑑定等。然後此Authentication會沿着調用線返回給UsernamePasswordAuthenticationFilter。 最後就是認證結果的處理部分了。本系統是通過實現UsernamePasswordAuthenticationFilter的successfulAuthentication和unsuccessfulAuthentication方法(也可使用Handler)來對認證結果進行操作。successfulAuthentication方法當認證成功時會調用,這裏採用JWT將認證信息封裝成Token,存入Redis,並將此Token返回給客戶端存入Cookie。而unsuccessfulAuthentication方法是在認證失敗時調用,這裏將請求forward到Error界面,並對錯誤結果進行渲染。

3、項目地址

本人的畢設項目——外匯業務管理系統

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章