vue+springboot前後端分離對接單點登錄

本來我們自己是有一套登錄系統的,且一直在線上使用!但公司要求登錄統一對接集團的單點登錄,且時間很急!由於之前沒有相關經驗,睬了很多坑,所以記錄一下!

開始理一下流程,首先通過域名訪問項目,首先進的是登錄頁,這個是nginx的配置,在進登錄頁掛載之前我先請求了一個後端接口

這個beforeMount函數是在進頁面之前就請求的函數, 這時候到了後端接口,接口是啥不重要,但是都會先經過這個過濾器,下面是過濾器具體實現代碼

代碼比較長,大致的流程是判斷當前單點登錄的session是否爲空,如果是空且本地的Shiro信息爲空跳到單點登錄地址!這個地址包括了登錄成功的回調地址,我這邊回調地址給了個特殊標識logincas,就是在單點登錄後進入我們系統我們自己也要模擬登陸,因爲我們是前後端分離項目,鑑權的邏輯在前端,單點登錄完之後我們本地模擬登陸,返回前端用戶的菜單和按鈕信息,以及我們本地也要執行Shiro的認證,後續根據Shiro獲取當前登錄人的信息,這邊單點登錄完之後單點登錄返回給我們的是一個userId, 這個在request裏就可以獲取,後續我們系統的處理參考如下面代碼

 

此時單點登錄已經成功了,後續就是我們自己系統的流程! 單點登出的流程很簡單,就是把單點登錄的session置爲空,本地的Shiro信息登出,然後跳轉到單點登出地址, 代碼如下

好了,現在整個流程已經結束!這是正常情況,但是在做的過程中還是遇到了不少問題,就是在單點登錄完之後這個單點登錄的session不是共享的,這個項目我們的後臺有多個服務,A服務登錄了訪問B服務的接口也是會跳到單點登錄頁面,我這邊改進的是通過request的請求頭來判斷,在我們本地Shiro登錄完之後,會給一個客戶端Cookie且名字是ylmsSessionId,後面接口訪問瀏覽器都會帶上這個Cookie來訪問的,我是根據這個來判斷是否已經登錄過,上面代碼有! 另一個問題是我們本地登錄Shiro有效期是30分鐘,單點登錄過期時間是2小時,也就是Shiro失效我們也要跳單點登錄頁面!我這邊Shiro的信息失效會跳轉一個默認接口,在接口返回相應的狀態碼及路徑,前端一個攔截器根據相應的狀態碼跳轉路徑,代碼如下