? ?最近在做Spring Security 單點(diǎn)集成的SSO項(xiàng)目峦筒,項(xiàng)目完成后,索性就研究了下其底層源碼的具體實(shí)現(xiàn)卤材。接下來,為大家分享一下用戶名密碼登陸的源碼解析:
? ? 首先扇丛,我們來看下下面這張類圖宠进。
1晕拆,頂層的抽象父類過濾器AbstractUserDetailsAuthenticationProvider是整個登陸流程的開始材蹬。在父類過濾器里面吝镣,會先執(zhí)行子類UsernamePasswordAuthenticationFilter過濾器的一個方法:attemptAuthentication()
2末贾,AuthenticationManager 實(shí)例化出來一個AuthenticationProvider 然后再AuthenticationProvider里面進(jìn)行校驗(yàn) 不通的登陸方式不一樣 我們表單提交是用戶名密碼登陸,ProviderManager負(fù)責(zé)收集所有的AuthenticationProvider 然后循環(huán)遍歷調(diào)用supports 看是否是用戶名密碼的登陸方式,主要是查看類是否是UsernamePasswordAuthenticationToken 這個類辉川,初始化的時候設(shè)置為false
3乓旗,DaoAuthenticationProvider 里面拿到UserDetails
4府蛇,預(yù)檢查查看用戶是否凍結(jié)屿愚,是否鎖定,檢查密碼是否正確穷遂,具體檢查可以跟進(jìn)代碼去看一下
5娱据,所有的檢查成功,則返回AbstractUserDetailsAuthenticationProvider
6祠锣,最后設(shè)置授權(quán)為true已授權(quán)
7咽安,所有認(rèn)證通過,返回一個Authentication妆棒,然后把數(shù)據(jù)保存到會話中。最后沿路返回动分。AbstractAuthenticationProcessingFilter 在這里設(shè)置成功失敗過濾器红选,也就是自己定義的過濾器
8,如果認(rèn)證失敗喇肋,則會拋出異常,走自己定義的失敗過濾器
以上:則是主要的用戶名密碼登陸流程甚侣。