SpringSecurity認證流程源碼講解

?? 上一篇文章中我們講了Spring Security個性用戶認證流程。這一節(jié)我們簡單講一講SpringSecurity的認證流程。我們先看一個流程圖:

流程圖

按照我們之前的配置,我們來講解整個流程

1.UsernamePasswordAuthenticationFilter

UsernamePasswordAuthenticationFilter

進入UsernamePasswordAuthenticationFilter的方法中,第二個紅色方框中的username和password是前端傳遞的用戶名和密碼。然后包裝為UsernamePasswordAuthenticationToken,這個類實現(xiàn)了Authentication接口!
包裝完成之后調(diào)用getAuthenticationManager().authenticate(authRequest)。
AuthenticationManager有很多實現(xiàn)類,其中一個就是ProvideManager。

2.ProvideManager

2.1選擇provider

ProvideManager

ProvideManager負責管理AuthenticationProvider,我們可以看到圖中有很多的providers,可以有SocialAuthenticationProvider(第三方接入的時候?qū)S茫?,AbstractUserDetailsAuthenticationProvider(我們配置的時候用到的)等等。其實真正執(zhí)行的只有一個provider,那么究竟會選擇哪一個provider,我們看到有一個supports方法。也就是根據(jù)上一步中的authentication的類型來做判斷。

2.2調(diào)用provider的authenticate方法

2.2.1獲取用戶信息


這里的關(guān)鍵方法就是調(diào)用我們自己實現(xiàn)的UserDetailsService類的方法先把用戶獲取到。

2.2.2檢查獲取到的用戶信息


是不是很眼熟,對的,就是根據(jù)我們返回的UserDetails中的信息做一個檢查--是否過期等等。。。

2.2.3驗證密碼是否正確

2.2.4驗證密碼是否過期

2.2.5創(chuàng)建UsernamePasswordAuthenticationToken表示認證成功

3.SecurityContextPersistenceFilter

那么我們把用戶信息認證完了后,其他請求是如何共享這一次登錄驗證的呢?這個就是靠SecurityContext上下文來完成這項工作的。用戶認證完成之后會把UsernamePasswordAuthenticationToken存入到Context中,而Context會存儲到session當中去,這樣,下一次請求過來的時候,就不用讓用戶在登錄了。那么是誰把認證信息放到Context里面去的呢?答案就是SecurityContextPersistenceFilter,這個Filter處于所有Filter的最前端位置:



??我們會看到在Filter的最后,一定會把context存入到session中,這樣如果用戶已經(jīng)登錄過一次,session中可以拿到Context,context中就可以拿到UsernamePasswordAuthenticationToken如下圖所示


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容