單點登錄 (SingleSign-On,SSO) ,是一種幫助用戶快捷訪問網(wǎng)絡(luò)中多個站點的安全通信技術(shù)。單點登錄系統(tǒng)基于一種安全的通信協(xié)議,該協(xié)議通過多個系統(tǒng)之間的用戶身份信息的交換來實現(xiàn)單點登錄。使用單點登錄系統(tǒng)時,用戶只需要登錄一次,就可以訪問多個系統(tǒng),不需要記憶多個口令密碼。
云程平臺支持CAS、OAuth2、JWT三種主流的單點登錄技術(shù),客戶可根據(jù)需求選擇對應(yīng)技術(shù)方案。
一、CAS總體架構(gòu)介紹
CAS(Central Authentication Service)是 Yale大學(xué)發(fā)起的一個企業(yè)級的、開源的項目,旨在為 Web 應(yīng)用系統(tǒng)提供一種可靠的單點登錄解決方法。CAS的目標是允許用戶訪問多個應(yīng)用程序只提供一次用戶憑據(jù)(如用戶名和密碼)。
CAS 體系包含兩個部分: CAS Server 和 CAS Client。CAS Server 需要獨立部署,主要負責(zé)對用戶的認證工作;CAS Client 負責(zé)處理對客戶端受保護資源的訪問請求,需要登錄時,重定向到 CAS Server。
CAS 具有以下特點:
- 一個開放的,文檔齊全的協(xié)議。
- 開源的JAVA服務(wù)器組件。
- CAS Client 支持非常多的客戶端(這里指單點登錄系統(tǒng)中的各個 Web 應(yīng)用),包括 Java, .NET, php, Perl, Apache, uPortal, Ruby 等。
- 文檔社區(qū)化和實現(xiàn)的支持。
- 具有廣泛的客戶群的支持。
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 的形式保存在瀏覽器中,根據(jù) TGC 可以幫助用戶找到對應(yīng)的 TGT,所以這個 TGC 有點類似與會話 ID。
- ST:ST 全稱是 Service Ticket,這是 CAS Sever 通過 TGT 給用戶發(fā)放的一張票據(jù),用戶在訪問其他服務(wù)時,發(fā)現(xiàn)沒有 Cookie 或者 ST ,那么就會 302 到 CAS Server 獲取 ST,然后會攜帶著 ST 302 回來,CAS Client 則通過 ST 去 CAS Server 上獲取用戶的登錄狀態(tài)。
CAS的單點登錄SSO流程如下, 應(yīng)用系統(tǒng)要做單點登錄,需要跟CAS服務(wù)進行集成,首先要理解CAS集成流程和原理。
- 用戶通過瀏覽器訪問應(yīng)用1,應(yīng)用1 發(fā)現(xiàn)用戶沒有登錄,于是返回 302,并且攜帶上一個 service 參數(shù),讓用戶去 CAS Server 上登錄。
- 瀏覽器自動重定向到 CAS Server 上,CAS Server 獲取用戶 Cookie 中攜帶的 TGC,去校驗用戶是否已經(jīng)登錄,如果已經(jīng)登錄,則完成身份校驗(此時 CAS Server 可以根據(jù)用戶的 TGC 找到 TGT,進而獲取用戶的信息);如果未登錄,則重定向到 CAS Server 的登錄頁面,用戶輸入用戶名/密碼,CAS Server 會生成 TGT,并且根據(jù) TGT 簽發(fā)一個 ST,再將 TGC 放在用戶的 Cookie 中,完成身份校驗。
- CAS Server 完成身份校驗之后,會將 ST 拼接在 service 中,返回 302,瀏覽器將首先將 TGC 存在 Cookie 中,然后根據(jù) 302 的指示,攜帶上 ST 重定向到應(yīng)用1。
- 應(yīng)用1 收到瀏覽器傳來的 ST 之后,拿去 CAS Server 上校驗,去判斷用戶的登錄狀態(tài),如果用戶登錄合法,CAS Server 就會返回用戶信息給 應(yīng)用1。
- 瀏覽器再去訪問應(yīng)用2,應(yīng)用2 發(fā)現(xiàn)用戶未登錄,重定向到 CAS Server。
- CAS Server 發(fā)現(xiàn)此時用戶實際上已經(jīng)登錄了,于是又重定向回應(yīng)用2,同時攜帶上 ST。
- 應(yīng)用2 拿著 ST 去 CAS Server 上校驗,獲取用戶的登錄信息。
- 在整個登錄過程中,瀏覽器分別和 CAS Server、應(yīng)用1、應(yīng)用2 建立了會話,其中,和 CAS Server 建立的會話稱之為全局會話,和應(yīng)用1、應(yīng)用2 建立的會話稱之為局部會話;一旦局部會話成功建立,以后用戶再去訪問應(yīng)用1、應(yīng)用2 就不會經(jīng)過 CAS Server 了。
三、CAS服務(wù)端如何部署
云程平臺對CAS 5.3.x版本無縫集成,并對CAS認證校驗進行了擴展,項目上請使用平臺提供的CAS 5.3.x運行包。運行CAS之前需要在數(shù)據(jù)庫先執(zhí)行平臺的腳本,CAS獲取用戶信息需訪問平臺的SYS_USER表。
1 修改數(shù)據(jù)庫連接
打開 casWEB-INFclassesApplication.properties
修改如下配置:
#數(shù)據(jù)庫配置
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目錄下執(zhí)行startup.bat(windows)或startup.sh(linux)。
啟動成功后訪問cas地址,界面如下圖所示:
四、云程如何對接CAS
平臺后端CAS配置
云程平臺后端已集成CAS代碼,在yml配置文件中配置cas服務(wù)地址即可。
application.yml 進行如下配置:
#cas單點登錄
cas:
prefixUrl: http://cas.example.org:8443/cas
平臺前端CAS配置
修改
public/config/bootConfig.js
VUE_APP_SSO設(shè)置為true
VUE_APP_CAS_BASE_URL配置單點登錄服務(wù)地址
//單點登錄是否開啟
VUE_APP_SSO:true,
//單點登錄地址
VUE_APP_CAS_BASE_URL:"http://cas.example.org:8443/cas"






