項目地址:鏈接: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中
如果認證成功就會去調用我們寫的那個接口
如果存在異常它也會去捕獲,然後去調用我們自定義的錯誤處理類