首頁 > 軟體

微服務前後端分離整合單點登入CAS

2021-05-27 15:01:41

一 簡介

前篇講到了springboot整合cas單點登入功能,但是在前後端分離的項目中,集合單點登入功能就遇到棘手的重定向問題。所謂前後端分離,也就是前端和後端是兩個獨立的系統,各自部署,前端通過restful api請求後端,後端在controler模組裡將前端請求的內容返回。加入cas單點登入功能後,cas有個跳轉功能,但是前端vue不支援重定向功能302跳轉,所以如何解決呢。

二 cas原理

單點登入cas功能涉及三個角色:CAS client,CAS server,瀏覽器。

它們的關係如下圖1所示。

前端向系統訪問資源,系統裡已經整合了cas client(cas 客戶端),這個客戶端和cas server是一套的。Cas client判斷使用者是否登入,即有沒有攜帶ticket,否則要跳轉到cas server登入。Cas server登入頁面填入正確的使用者名和密碼,使用者在 CAS server認證成功後,CAS 生成 cookie(叫TGC),寫入瀏覽器,同時生成一個 TGT 物件,放入自己的快取,TGT 物件的 ID 就是 cookie 的值(叫jsessionId)。 當 再次請求到來時,如果傳過來的有 CAS 生成的 cookie,則 CAS 以此 cookie 值為 key 查詢快取中有無 TGT,如果有,說明使用者之前登入過,如果沒有,則使用者需要重新登入。Cas server重定向到資源,此時攜帶TGT,CAS client拿這個TGT到cas server檢查是否合法,若合法則將資源資訊返回給前端展示。

圖1

三 微服務整合cas過程

使用者沒登入過,發起請求,判斷未登入,跳轉到cas server伺服器登入,輸入正確的使用者名和密碼,登入成功後,地址後面有service=請求資源,跳轉到請求資源網址。

圖2 發起請求,跳轉到登陸頁面
圖3 登陸頁面
圖4 登陸後請求到的資源

2、登入過後,請求其他資源,由於剛才已經登入過,再次請求攜帶了sessionid去請求,cas驗證通過,准予放行。

圖5 請求其他資源 攜帶cookie

3、cas server伺服器日誌情況

圖6 請求驗證過程cas server日誌

四 請求過程

前端發起請求Cas client攔截,判斷使用者未登入,重定向到cas server的登入頁面,後面帶參數service=controller一個服務,用來作重定向,同時也要攜帶之前的請求資源地址Cas server登入成功後,根據service的網址請求後端controller網址,在controller裡返回請求資源地址和cas server返回的jsessionId前端獲取到jsession,將它儲存在cookie裡,後面每次請求都攜帶該jsessionId請求後端資源五 遇到問題集錦

前後端分離,cas返回跳轉302,前端無法獲取到跳轉地址,導致不會跳轉到cas server登入介面

圖7 302跳轉
圖8 cas client跳轉 前端收不到資訊

解決方案:

下載java decompiler反編譯工具,將cas的AuthenticationFilter.class拉到反編譯工具裡檢視源碼。解決方案看圖說明。修改完後,重新啟動項目,重新請求資源,這時前端就可以收到資訊,返回資訊格式前後端溝通好即可。

圖9 cas client包裡類
圖10 放到反編譯工具裡看源碼
圖11 修改源碼
圖12 cas client返回資訊給前端

2、使用者登入成功後,攜帶ticket請求後端資源,發現ticket目標不對,如圖所示,還沒登入時,前後請求的資源有一點點不對,ticket就判斷不通過。後端程式碼報ticketvalidationexception票根不符合目標服務的錯誤資訊。

圖13 ticket不對
圖13 ticket正確

3、未認證授權的服務問題

訪問客戶端資源,還要將訪問的服務註冊到cas伺服器才可以訪問,我們之前已經註冊過。下圖16正則表示式表示所有網址都可以訪問,這時比較籠統的配置,如果比較嚴格,註冊具體域名資訊等等,也是類似的方法。檔名稱以 「服務名-id」命名,id就是檔案裡的id。serviceId這行寫註冊的服務的過濾規則,採用正則表示式。

圖14 未認證
圖15 未認證日誌
圖16 配置

六 總結

本文講述了前後端分離整合cas單點登入功能,如何修改源碼等,若大家還有疑問, 關注"金領虎少兒學習"留言疑問,我們看到會及時回答。


IT145.com E-mail:sddin#qq.com