單點登錄 (SingleSign-On,SSO) ,是一種幫助用戶快捷訪問網絡中多個站點的安全通信技術。單點登錄系統基于一種安全的通信協議,該協議通過多個系統之間的用戶身份信息的交換來實現單點登錄。使用單點登錄系統時,用戶只需要登錄一次,就可以訪問多個系統,不需要記憶多個口令密碼。
云程平臺支持CAS、OAuth2、JWT三種主流的單點登錄技術,客戶可根據需求選擇對應技術方案。
一、CAS總體架構介紹
CAS(Central Authentication Service)是 Yale大學發起的一個企業級的、開源的項目,旨在為 Web 應用系統提供一種可靠的單點登錄解決方法。CAS的目標是允許用戶訪問多個應用程序只提供一次用戶憑據(如用戶名和密碼)。
CAS 體系包含兩個部分: CAS Server 和 CAS Client。CAS Server 需要獨立部署,主要負責對用戶的認證工作;CAS Client 負責處理對客戶端受保護資源的訪問請求,需要登錄時,重定向到 CAS Server。

CAS 具有以下特點:
- 一個開放的,文檔齊全的協議。
- 開源的JAVA服務器組件。
- CAS Client 支持非常多的客戶端(這里指單點登錄系統中的各個 Web 應用),包括 Java, .NET, php, Perl, Apache, uPortal, Ruby 等。
- 文檔社區化和實現的支持。
- 具有廣泛的客戶群的支持。
CAS官方文檔:https://apereo.github.io/cas/5.3.x/index.html#
二、CAS單點原理和集成流程
在 CAS 的整個登錄過程中,有三個重要的概念。
- TGT:TGT 全稱叫做 Ticket Granting Ticket,這個相當于我們平時所見到的 HttpSession 的作用,用戶登錄成功后,用戶的基本信息,如用戶名、登錄有效期等信息,都將存儲在此。
- TGC:TGC 全稱叫做 Ticket Granting Cookie,TGC 以 Cookie 的形式保存在瀏覽器中,根據 TGC 可以幫助用戶找到對應的 TGT,所以這個 TGC 有點類似與會話 ID。
- ST:ST 全稱是 Service Ticket,這是 CAS Sever 通過 TGT 給用戶發放的一張票據,用戶在訪問其他服務時,發現沒有 Cookie 或者 ST ,那么就會 302 到 CAS Server 獲取 ST,然后會攜帶著 ST 302 回來,CAS Client 則通過 ST 去 CAS Server 上獲取用戶的登錄狀態。
CAS的單點登錄SSO流程如下, 應用系統要做單點登錄,需要跟CAS服務進行集成,首先要理解CAS集成流程和原理。

- 用戶通過瀏覽器訪問應用1,應用1 發現用戶沒有登錄,于是返回 302,并且攜帶上一個 service 參數,讓用戶去 CAS Server 上登錄。
- 瀏覽器自動重定向到 CAS Server 上,CAS Server 獲取用戶 Cookie 中攜帶的 TGC,去校驗用戶是否已經登錄,如果已經登錄,則完成身份校驗(此時 CAS Server 可以根據用戶的 TGC 找到 TGT,進而獲取用戶的信息);如果未登錄,則重定向到 CAS Server 的登錄頁面,用戶輸入用戶名/密碼,CAS Server 會生成 TGT,并且根據 TGT 簽發一個 ST,再將 TGC 放在用戶的 Cookie 中,完成身份校驗。
- CAS Server 完成身份校驗之后,會將 ST 拼接在 service 中,返回 302,瀏覽器將首先將 TGC 存在 Cookie 中,然后根據 302 的指示,攜帶上 ST 重定向到應用1。
- 應用1 收到瀏覽器傳來的 ST 之后,拿去 CAS Server 上校驗,去判斷用戶的登錄狀態,如果用戶登錄合法,CAS Server 就會返回用戶信息給 應用1。
- 瀏覽器再去訪問應用2,應用2 發現用戶未登錄,重定向到 CAS Server。
- CAS Server 發現此時用戶實際上已經登錄了,于是又重定向回應用2,同時攜帶上 ST。
- 應用2 拿著 ST 去 CAS Server 上校驗,獲取用戶的登錄信息。
- 在整個登錄過程中,瀏覽器分別和 CAS Server、應用1、應用2 建立了會話,其中,和 CAS Server 建立的會話稱之為全局會話,和應用1、應用2 建立的會話稱之為局部會話;一旦局部會話成功建立,以后用戶再去訪問應用1、應用2 就不會經過 CAS Server 了。
三、CAS服務端如何部署
云程平臺對CAS 5.3.x版本無縫集成,并對CAS認證校驗進行了擴展,項目上請使用平臺提供的CAS 5.3.x運行包。運行CAS之前需要在數據庫先執行平臺的腳本,CAS獲取用戶信息需訪問平臺的SYS_USER表。
1 修改數據庫連接
打開 casWEB-INFclassesApplication.properties
修改如下配置:
#數據庫配置
spring.datasource.driver-class-name=com.MySQL.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/yuncheng2021?characterEncoding=UTF-8&useUnicode=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
2 啟動cas
需要準備Tomcat,把cas包放到tomcat/webapps目錄下,在tomcat/bin目錄下執行startup.bat(windows)或startup.sh(linux)。
啟動成功后訪問cas地址,界面如下圖所示:

四、云程如何對接CAS
平臺后端CAS配置
云程平臺后端已集成CAS代碼,在yml配置文件中配置cas服務地址即可。
application.yml 進行如下配置:
#cas單點登錄
cas:
prefixUrl: http://cas.example.org:8443/cas
平臺前端CAS配置
修改
public/config/bootConfig.js
VUE_APP_SSO設置為true
VUE_APP_CAS_BASE_URL配置單點登錄服務地址
//單點登錄是否開啟
VUE_APP_SSO:true,
//單點登錄地址
VUE_APP_CAS_BASE_URL:"http://cas.example.org:8443/cas"