CAS 6.2.x 單點(diǎn)登錄
環(huán)境
- 系統(tǒng):Windows 10 企業(yè)版 LTSC 1809
- 開(kāi)發(fā)軟件:Intellij IDEA 2020.1 (UltiMate Edition)
- Intellij IDEA 還需要安裝 Lombok 插件
- Java:11.0.7 2020-04-14 TLS
- Tomcat:apache-tomcat-9.0.38
- Gradle: gradle-6.6.1
- CAS Server: 6.2.x
- CAS Client: 3.4.1
集成方式
使用官方推薦的 Overlay 方式湘捎,Overlay 方式只需下載 cas.war 包,然后只添加自己所需要的模塊和配置,修改源碼時(shí)忍坷,也只需要配置源碼相同路徑的代碼卷拘,即可覆蓋源碼缘薛。這種方式減少了打包復(fù)雜度和打包效率沃测,自定義代碼在長(zhǎng)期的迭代過(guò)程中出現(xiàn)未知溶褪,或者混亂的代碼塊,在升級(jí) CAS 版本時(shí)也能夠減少很大的工作量沙咏。
項(xiàng)目地址
- CAS Server: https://github.com/apereo/cas-overlay-template
- CAS Client: https://github.com/cas-projects/cas-sample-java-webapp
項(xiàng)目的 hosts 配置
127.0.0.1 cas.example.org
127.0.0.1 client1.example.org
127.0.0.1 client2.example.org
Step1 拉取項(xiàng)目
git clone https://github.com/cas-projects/cas-sample-java-webapp
git clone https://github.com/cas-projects/cas-sample-java-webapp cas-sample-java-webapp2
git clone -b 6.2 https://github.com/apereo/cas-overlay-template cas-server
Step2 導(dǎo)入項(xiàng)目到 IDEA 中
CAS Server 項(xiàng)目
這里 CAS Server 項(xiàng)目是 Gradle
導(dǎo)入后辨图,等待構(gòu)建完成后,右下角可以看到提示要啟用 Lombok肢藐,點(diǎn)擊啟用即可
CAS Client 項(xiàng)目
這里 Client 項(xiàng)目是 Mavn 項(xiàng)目
Client 2 同上的方式導(dǎo)入到 IDEA 中
最終如下圖三個(gè)項(xiàng)目
Step3 配置 Tomcat 容器
CAS Server 項(xiàng)目
如下圖配置,為 Tomcat 添加 War 包,并修改項(xiàng)目 URL 前綴,
Client 項(xiàng)目
Client1
配置 Tomcat 同 CAS Server 一樣徒役,配置URL分別為 Client1 和 Client2
Client2
Step4 修改配置
CAS Server 配置修改
application.yml
cas:
server:
name: http://cas.example.org:8080
prefix: ${cas.server.name}/cas
authn:
accept:
# 登錄賬號(hào),默認(rèn)為 casuser::Mellon
users: admin::admin
service-registry:
# 是否重新讀取 json
init-from-json: true
json:
# 服務(wù)注冊(cè)時(shí)讀取的 json 文件位置
location: file:E:\\26-cas\\cas-overlay-template\\etc\\cas\\services
tgc:
# Cookies 保存時(shí)窖壕,http 需要設(shè)置該值為false忧勿,否則無(wú)法保存Cookies成功
secure: false
項(xiàng)目結(jié)構(gòu)如圖下,1和2位置需要對(duì)應(yīng)
添加 json 服務(wù)注冊(cè)的支持的依賴
在 build.gradle 中瞻讽,配置如圖下
HTTPSandIMAPS-10000001.json
{
"@class": "org.apereo.cas.services.RegexRegisteredService",
"serviceId": "^(http|https|imaps)://.*",
"name": "HTTPS and IMAPS",
"id": 10000001,
"description": "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",
"evaluationOrder": 10000
}
HTTPSandIMAPS-10000001.json 文件來(lái)自鸳吸,如下圖,使用 explodeWar 命令從 cas.war包中解壓出速勇,然后從build/cas-resources/servers/ 中復(fù)制出來(lái)晌砾,還可以使用 getResource 命令直接復(fù)制指定文件出來(lái),這里提個(gè)醒烦磁,getResource 命令在 Windows 下還需手動(dòng)修改下 gradle 腳本中拷貝文件時(shí)使用的路徑分隔符养匈。
拷貝出來(lái)后,ServicesId 像中添加 http 的支持
"serviceId": "^(http|https|imaps)://.*",
Client 配置
只需修改 webapp/WEB-INF/web.xml 中如下圖5個(gè)位置的配置
client2,在下圖中3,5中配置的url修改對(duì)應(yīng)的地址即可,就不贅述了
如下圖位置注釋:
否則CAS server 端會(huì)有: <No multifactor authentication providers are available in the application context to satisfy [[mfa-duo]]>
Step5 編譯打包運(yùn)行
CAS Server
因?yàn)槭?Overlay 的方式都伪,修改配置文件還需要將配置文件打包進(jìn) War 包內(nèi)呕乎,所以需要執(zhí)行下面命令
gradlew.bat clean copyCasConfiguration build
gradlew 可以如下圖方式,先直接用瀏覽器下載到本地陨晶,然后修改配置讀取本地 gradle
編譯打包后猬仁,運(yùn)行如下
Client2 同理
Step6 抓包驗(yàn)證單點(diǎn)登錄的過(guò)程
-
瀏覽器輸入 http://client1.example.org:9081/client1 并回車進(jìn)入
如下圖,請(qǐng)求 client1 后會(huì)返回 302 先誉,并跳轉(zhuǎn)到 cas server 的登錄界面
-
輸入賬號(hào)密碼登錄
- 請(qǐng)求 login 登錄接口驗(yàn)證成功后返回302重定向到 client 攜帶這 ticket=ST-xxx 并且設(shè)置了 cookie (Set-Cookie)
-
client1 后端接到帶有 ticket=ST-xxx 的請(qǐng)求湿刽,然后回去請(qǐng)求 cas.example.org 驗(yàn)證 這個(gè) ST-xxx ,驗(yàn)證成功回返回 302 重定向回用戶真正想訪問(wèn)的資源褐耳,如下圖的標(biāo)號(hào)5為驗(yàn)證ST的請(qǐng)求诈闺,6 為驗(yàn)證成功后重定向的地址并且,設(shè)置了 client1 的 Cookie
登錄成功后最終 Chrome 瀏覽器內(nèi)的Cookie 如下
- 輸入 client2 地址
瀏覽器輸入: http://client2.example.org:9082/client2/ 并回車铃芦,可以看到直接登錄了
- client2 先重定向到 cas.example.org 并帶上 Service
- 由于上面 Client1 登錄了雅镊,并設(shè)置 cas.example.org 的 Cookie 這是請(qǐng)求登陸時(shí)就帶上了這個(gè) Cookie 如圖中標(biāo)號(hào)3
- cas.example.org 驗(yàn)證這個(gè) Cookie 成功后把曼,表示是登錄狀態(tài),又返回 302 并帶上服務(wù)的 ticket=ST-xxx 重定向 client2 如圖標(biāo)號(hào)4
-
如圖標(biāo)號(hào)5 client2 接收并到CAS 中驗(yàn)證該 ticket=ST-xxx 漓穿,驗(yàn)證成功后再 返回 302 嗤军,將調(diào)轉(zhuǎn)到最終的用戶想訪問(wèn)的資源頁(yè)面,如圖標(biāo)號(hào)6
問(wèn)題
在上面驗(yàn)證中晃危,可能會(huì)碰到 Cookie 無(wú)法保存的問(wèn)題叙赚,導(dǎo)致進(jìn)入 client2 時(shí)還是要登錄,后面發(fā)現(xiàn)問(wèn)題是 Chrome 80+版本中 secure 設(shè)置 false 則SameSite不能設(shè)置為 None僚饭。
如下圖震叮,F(xiàn)12 控制臺(tái)查看請(qǐng)求,查為什么 Cookie 沒(méi)有保存
解決方式
-
配置 same-site-policy=none|lax|strict Cookie 屬性
-
Chrome 忽略該問(wèn)題的方式
如下圖禁用該屬性
參考
- 官方 Overlay 教程(需要梯子):https://apereo.github.io/cas/6.2.x/installation/WAR-Overlay-Installation.html
- JSON 服務(wù)注冊(cè)配置:https://apereo.github.io/cas/6.2.x/services/JSON-Service-Management.html#json-service-registry
- Cookie 設(shè)置:https://apereo.github.io/cas/6.2.x/configuration/Configuration-Properties-Common.html#cookie-properties
- SameSite 問(wèn)題:https://guangming.zjport.gov.cn/detail/govconsult/2020_3/9_3/202009031220_1.shtml
- 單點(diǎn)登錄過(guò)程圖:https://apereo.github.io/cas/6.2.x/protocol/CAS-Protocol.html