前幾天,跟一位資深老猿交流學(xué)習(xí)經(jīng)驗(yàn)厘线,才知道只是共享识腿,代碼開源的重要性。于是乎造壮,就注冊了這個(gè)平臺渡讼,第一次發(fā)文,后面會陸續(xù)把我之前總結(jié)的學(xué)習(xí)經(jīng)驗(yàn)共享處理,還望互聯(lián)網(wǎng)的前輩們多多指教成箫。
因?yàn)閯偤眠@段時(shí)間展箱,公司在做第三方登陸和單點(diǎn)登陸。在對接完工作后伟众,我對spring security的源碼進(jìn)行了一個(gè)跟蹤學(xué)習(xí)析藕。這篇我們來分析一下第三方登陸的源碼分析
首先,在講解第三方登陸之前凳厢,OAuth2協(xié)議我就不多說了账胧,我們來看下QQ或者微信授權(quán)碼模式的登陸時(shí)序圖:
看懂了上面的時(shí)序圖后,我們先來看下社交登陸的涉及到的幾個(gè)類:
第一步先紫,首先會進(jìn)入SocialAuthenticationFilter 這個(gè)filter,而這個(gè)filter繼承了父類的filter方法治泥,
先執(zhí)行父類AbstractAuthenticationProcessingFilter的doFilter方法,
然后調(diào)用子類SocialAuthenticationFilter 的實(shí)現(xiàn)方法authResult =this.attemptAuthentication(request, response);
第二步遮精,調(diào)用獲取SocialAuthenticationService接口的實(shí)例對象居夹,構(gòu)建auth =this.attemptAuthService(authService, request, response);方法的實(shí)現(xiàn)
第三步,在最終執(zhí)行doAuthentication方法的時(shí)候本冲,會先構(gòu)建這個(gè)方法需要的兩個(gè)參數(shù)准脂,一個(gè)authService 第二步以及構(gòu)建出來,一個(gè)SocialAuthenticationToken 這個(gè)方法里已經(jīng)獲取到token,具備這兩個(gè)參數(shù)后檬洞,開始執(zhí)行下一步
第四步狸膏,獲取一個(gè)AuthenticationManager? 這個(gè)manager由其子類ProviderManager 來具體實(shí)現(xiàn)這個(gè)方法
第四步,我們來看下這個(gè)ProviderManager 的具體流程添怔,這里面使用了一個(gè)AuthenticationProvider 接口 通過這個(gè)接口的實(shí)現(xiàn)類SocialAuthenticationProvider來具體實(shí)現(xiàn)這個(gè)方法
第五步湾戳,SocialAuthenticationProvider 調(diào)用我們自己的實(shí)現(xiàn)類,去數(shù)據(jù)庫查數(shù)據(jù)判斷用戶登陸數(shù)據(jù)是否滿足登陸條件
第六步广料,返回成功后調(diào)用updateConnections 方法砾脑,創(chuàng)建UsersConnectionRepository 保存第三方應(yīng)用數(shù)據(jù)到數(shù)據(jù)庫中
了解源碼之后,接下來我們就來分析下我們實(shí)現(xiàn)一個(gè)第三方登陸需要具體哪些流程:
spring security 給我們提供了一個(gè)接口艾杏,專門用來實(shí)現(xiàn)第三方登陸的業(yè)務(wù)邏輯韧衣,第一個(gè)類就是
AbstractOAuth2ServiceProvider? 而這個(gè)類具體依賴OAuth2Template,AbstractOAuth2ApiBinding 這兩個(gè)類糜颠,具體類圖如下
所以我們先要獲取這兩個(gè)實(shí)現(xiàn)汹族,才能拿到AbstractOAuth2ServiceProvider
這里看下我們需要實(shí)現(xiàn)的幾個(gè)類已經(jīng)對應(yīng)的接口之間的類圖。
如果需要自定義請求路徑其兴,需要自己實(shí)現(xiàn)SpringSocialConfigurer 并且配置filterProcessesUrl 。