spring security 的jwt認證以及原理解析


1.我們需要建立一個token的生產解析管理器,用於生成token,獲取Authentication,驗證token格式,以及從請求中獲取token;
2.因為我們使用token進行權限控制等,所以我們需要重寫一個基於token認證的過濾器,截取請求中的token首先對其進行一個redis查詢存在后並對其解析(解密-需要正常獲取沒有拋出異常)獲取信息后,將其轉化成Authentication設置到SecurityContextHolder.getContext()上下文中;
3.將此過濾器配置到spring securit的過濾器鏈中,並將此過濾器設置到UsernamePasswordAuthenticationFilter之前;
4.需要實現userDetailsService,並將權限信息設置到UserDetails,重寫loadUserByUsername方法
5.將內容配置到繼承於WebSecurityConfigurerAdapter的配置類中去,並設置相應的一些過濾器如跨域,如token過濾器,未取得憑證或未取得授權的攔截器,也可以自定義去實現注解基於不需要權限認證的配置項

6.其中UsernamePasswordAuthenticationFilter中進行校驗的是通過loadUserByUsername生成一個UserDetails與傳入的UsernamePasswordAuthenticationToken進行校對

7.AuthenticationManager作為身份認證的核心接口,當自定義登錄的時候我們需要委托給他的實現類ProviderManager進行身份認證,其中ProviderManager中含有AuthenticationProvider列表,會依次輪詢里面AuthenticationProvider,當所構造的Authentication(如:UsernamePasswordAuthentication)被支持后會調用authenticate方法,如UsernamePasswordAuthentication調用的就是DaoAuthenticationProvider中的authenticate方法:
retrieveUser(...): 調用子類 DaoAuthenticationProvider 的 retrieveUser()方法獲取 UserDetails
preAuthenticationChecks.check(user): 對從上面獲取的UserDetails進行預檢查,即判斷用戶是否鎖定,是否可用以及用戶是否過期
additionalAuthenticationChecks(user,authentication): 對UserDetails附加的檢查,對傳入的Authentication與獲取的UserDetails進行密碼匹配
postAuthenticationChecks.check(user): 對UserDetails進行后檢查,即檢查UserDetails的密碼是否過期
createSuccessAuthentication(principalToReturn, authentication, user): 上面所有檢查成功后,利用傳入的Authentication 和獲取的UserDetails生成一個成功驗證的Authentication

這個方法實際上是調用DaoAuthenticationProvider的additionalAuthenticationChecks方法,內部調用加密解密器進行密碼匹配,如果匹配失敗,則拋出一個 BadCredentialsException異常
最后通過createSuccessAuthentication(..)方法生成一個成功認證的 Authentication,簡單說就是組合獲取的UserDetails和傳入的Authentication,得到一個完全填充的Authentication。
該Authentication最終一步一步向上返回,到AbstractAuthenticationProcessingFilter過濾器中,將其設置到 SecurityContextHolder。

8.自定義一個TokenFilter,將其設置在UsernamePasswordAuthenticationFilter之前,則會進行過濾器鏈的輪詢,當TokenFilter能夠正確的設置SercurityHolder的安全上下文,將其傳遞給下一個過濾器即UsernamePasswordAuthenticationFilter,(在此之前會判斷此請求是否是匹配的需要身份驗證的請求,不是則不執行下面描述的驗證邏輯)但在該過濾器中需要驗證login的Post方法並且需要攜帶username與password,所以此驗證失敗則直接返回,不再執行身份驗證

9.最后才是真正的驗證權限邏輯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM