一般狀況下,咱們的單點登陸認證中心要支持多個服務的統一認證。咱們的實現步驟通常是先配置服務註冊中心方案、而後配置受權服務、最後重啓服務。html
按以上步驟執行完,大部分均可以獲得預期的服務管理目的。而有時候在登陸的時候會遇到這種提示:未認證受權的服務
。對於剛接觸CAS的人來講,看到這個提示每每不知道該如何處理。出現這個錯誤的緣由有不少,好比服務加載失敗、服務更新失敗、serviceID
正則表達式寫錯等等,其實歸根結底是一個緣由:在登陸過程當中校驗受權服務時,沒有找到匹配的服務
。git
爲何沒有匹配到受權服務?github
內部的服務管理機制是什麼樣的?正則表達式
應該怎麼解決?redis
本文將深刻剖析CAS服務管理原理,包括服務管理總體架構、服務初始化過程、服務更新機制、服務校驗過程、以及服務管理工具等。經過本文至少能夠有如下收穫:編程
如上圖所示,CAS服務管理的總體架構能夠分爲三層:緩存
服務註冊中心負責存儲受權服務,它支持多種存儲方案,如內存、JSON文件、JPA、Redis、MongoDb等等。安全
CAS中的服務註冊中心實現方案經過實現ServiceRegistry接口來實現:架構
服務管理器負責管理服務註冊中心。正是由於有了服務管理器,才實現了服務存儲的透明化,使調用方對服務存儲方式無感知。也使服務存儲更容易擴展,開發者能夠根據本身的需求來實現個性化存儲。併發
CAS中的服務管理器實現方案經過實現ServicesManager接口來實現:
咱們在這裏將服務管理的調用方的統稱爲服務管理組件。如登陸組件在登陸過程當中須要經過服務管理器獲取受權來校驗服務、服務定時器定時更新受權服務、服務初始化組件須要在服務啓動時初始化受權服務等等。
啓用服務初始化功能後(cas.serviceRegistry.initFromJson=true
),服務啓動的第一步就是進行服務初始化,其目的是將註冊中心中的受權服務加載到服務管理器中。
服務管理器充當訪問服務的緩存層,後續的服務訪問都要經過服務管理器。
服務的初始化過程包含如下幾步:
不一樣的服務管理器還會基於servicesMap將服務保存到本身的服務集合中,以實現個性化管理策略。
CAS中的服務更新是經過定時調度來實現的,啓用或關閉此功能經過cas.serviceRegistry.schedule.enabled=true/false
來控制。
服務的更新過程包含如下幾步:
安全起見,CAS單點登陸的過程當中都要進行受權服務的校驗。
服務的校驗過程包含如下幾步:
InitialFlowSetupAction
,並將其添加到登陸流程裏;InitialFlowSetupAction
,來校驗服務;未認證受權的服務
提示。經過以上的服務校驗過程,能夠獲得如下結論:
未認證受權的服務
提示,必定是服務匹配問題,要從這方面找緣由和解決方案。CAS官方推出的服務管理工具是:CAS Management
。咱們這裏主要介紹CAS Management的功能和實現原理。
瞭解完服務的加載、更新機制後,若是有個性化需求,咱們也能夠實現本身的服務管理工具。
CAS Management在實現了服務管理功能基礎上,還有兩個核心亮點:服務版本控制和委託用戶管理。
服務管理基礎功能就不介紹了,已經包含在了服務版本控制流程內。
服務的版本控制是經過在本地創建一個git倉庫,而後經過操做這個git倉庫,發佈後同步到CAS Server服務註冊中心中,最後經過服務管理的更新機制,同步到CAS Server中。
服務的版本控制的好處顯而易見:
服務版本控制流程:
提交
按鈕提交本次變動;發佈
按鈕,發佈
後會將倉庫中的服務經過CAS Server服務管理器同步到CAS Server服務註冊中心;CAS Management的委託用戶管理功能相似github上的PR,在以上服務版本控制的前面多出了PR的步驟,即:
馬軍偉,草根碼農一枚,jbone項目做者。
關注領域:微服務、高併發編程、單點登陸等。
Github:github.com/417511458
Gitee: gitee.com/majunwei201…
主頁:jbone.cn
QQ: 417511458
公衆號:writebugs
原創文章,歡迎轉載!但請務必保留全文,並說明出處