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

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

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

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如下圖所示
