Spring Security深入淺出--2、認證流程源碼級詳解(一)

項目地址:鏈接:https://pan.baidu.com/s/106lZU8P9gHG4A3aP4OpOgQ
提取碼:xs3v

認證流程源碼級詳解

認證流程說明

 啓動項目

點擊登錄,進入到UsernamePasswordAuthenticationFilter類中

然後獲取用戶名和密碼

obtainUsername()和obtainPassword()方法獲取用戶名和密碼起底層就是
request.getParameter("username");

request.getParameter("password");

調用UsernamePasswordAuthenticationToken類

進入到UsernamePasswordAuthenticationToken類中,也就是給本地的principal和credentials賦值

 由於剛剛開始,父類權限還沒傳入,所以傳入的是null

setAuthenticated()方法判斷的是當前是否進行了身份認證,由於是剛剛傳入的,所以還沒有進行身份認證,所以是false

回來,實例化authRequest,通過setDetails(request, authRequest)將請求request裏面的其他信息傳入的authRequest中

 底層就是獲取request地址以及session給authRequest的details賦值

調用 AuthenticationManager類,這個類主要其到管理的作用

由於 AuthenticationManager是接口,整個賦值是在security啓動的時候

繼續debug,進入到ProviderManager類,可以看到他就是實現了AuthenticationManager接口

獲取AuthenticationProvider,因爲校驗邏輯都寫在裏面,爲什麼是集合,因爲不同的登陸方式,校驗邏輯是不一樣的 

判斷當前的authentication是否支持,當前getClass的類型是UsernamePasswordAuthenticationToken方式的校驗。因爲還有其他的第三方校驗方式如微信,qq等,他們使用的就不是UsernamePasswordAuthenticationFilter,而是SocialAuthenticationFilter

當支持的時候就會往下繼續執行,否則就繼續循環,具體的實現DaoAuthenticationProvider,但是authenticate()方法是在他的抽象類AbstractUserDetailsAuthenticationProvider中實現的

在 authenticate()方法中,調用retrieveUser()方法獲取user(UserDetails)類,

獲取的UserDetails就是我們自定義的那個UserDetails,並且調用了loadUserByUsername()方法

緊着着就是對user(UserDetails)進行校驗

對user校驗完畢之後,緊接着調用了additionalAuthenticationChecks()方法,對用戶傳入的密碼和數據庫查詢出來的密碼進行校驗

上面的兩個檢查完畢,進入到下面的postAuthenticationChecks.check(user);

檢查四個布爾值,以及密碼沒有問題之後,調用createSuccessAuthentication(principalToReturn, authentication, user);

在createSuccessAuthentication()中,調用的是UsernamePasswordAuthenticationToken()四個參數的構造函數,並且設置super.setAuthenticated(true);

最後返回一個以及認證的Authentication。最後一路返回到UsernamePasswordAuthenticationFilter類中

認證完成之後進入到類AbstractAuthenticationProcessingFilter中

如果認證成功就會去調用我們寫的那個接口

如果存在異常它也會去捕獲,然後去調用我們自定義的錯誤處理類

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