CAS集群解決方案
1. 總體方案
本方案的目的是搭建一個高可用,高可伸縮的中心認證服務。環境是CAS服務器是可任意擴展的,任意一個CAS服務節點均是等效的,CAS服務器的狀態信息是集中存儲的;CAS服務的客戶端應用也是集群的環境,客戶端應用服務器也是可任意擴展的,客戶端應用的session狀態信息是集中存儲的,任意兩個應用服務節點都是等效的;CAS服務器和客戶端應用的狀態信息集中存儲在緩存服務器Memcached上。該方案具有以下特性。
l 只支持Tomcat6.x和Tomcat7.x。
l 無單點故障。
l 能夠應對Tomcat故障轉移。
l 能夠應對memcached故障轉移。
注意:上述方案中有一個問題是如果cas服務端應用程序或者客戶端應用程序將某些狀態數據直接存儲在jvm本地對象中的時候,則節點會出現不等效的情況,甚至出現不穩定的故障。該問題的解決辦法是:1.避免這樣的情況。2.同步各jvm實例之間的所有對象。
1.1. 正常登錄流程(未單點登錄)討論
討論用戶的瀏覽器里無TGT cookie值,即未曾登錄過CAS服務器。
1. 用戶瀏覽器訪問必聯網受保護的資源,假設用戶未登錄必聯網應用,由于必聯網各節點的session狀態集中存儲,則任意一個節點都是等效的。
2. 用戶瀏覽器被轉發請求到cas服務器。同時會帶上參數service,即帶上必聯網的URL地址。
3. 用戶訪問cas服務的/login地址。用戶的cookie中不存在TGT值。Cas服務器生成LT,并返回登錄頁面給用戶瀏覽器。
4. 用戶在登錄頁面上輸入正確的用戶名和密碼,提交到cas服務器。
5. cas服務器接收到用戶的憑證信息。經過驗證后,若正確,則生成TGT,并存儲在Ticket倉庫中,由于帶上了service參數值,同時cas會為該service生成ST值。然后返回到用戶瀏覽器,將TGT值寫入到用戶瀏覽器的cookie中,同時將瀏覽器重定向都service參數值制定的url值,附帶參數ticket=ST值。
6. 用戶再次訪問必聯網受保護資源。帶上參數值ticket=ST。必聯網應用中的過濾器檢測到帶有該參數后,會將參數service和ticket的值發送請求給cas的URL地址/serviceValidate。該地址會校驗ST。校驗結束后會返回一個校驗結果給客戶端應用,如果正確則會返回登錄的用戶名。客戶端應用則會在本應用為該用戶執行登錄后處理,如加載用戶信息和權限等放入到session中。至此登錄完成。
7. 考慮用戶訪問到不同的服務器上。如用戶第一次訪問到必聯網應用節點1,第二次訪問都必聯網節點2上,由于session信息是共享的,則兩個節點是等效的。若用戶第一次訪問到cas節點1,第二次訪問cas節點2,由于session和票據信息是共享集中存儲的,用戶訪問到任意節點都是等效的,票據在任意節點都能夠得到有效地認證。
結論:該情況的流程集群不存在問題。
1.2. 已單點登錄流程
當用戶瀏覽器有合法的TGT,即用戶瀏覽器已經登錄過CAS服務器。在這種情況下,用戶再訪問必聯網,用戶未登錄必聯網應用。
1. 用戶訪問必聯網受保護的資源,由于必聯網各節點的session狀態集中存儲,則任意一個節點都是等效的。由于用戶未登錄必聯網應用,則會攔截該請求,將其請求轉發到CAS服務器,同時會帶上參數service,即帶上必聯網的URL地址。
2. 用戶訪問cas服務的/login地址。由于已經登錄過cas服務器,則用戶的cookie中存在TGT值,在對該TGT值進行驗證,若正確,由于帶上了service參數值,同時cas會為該service生成ST值。然后返回到用戶瀏覽器,同時將瀏覽器重定向都service參數值制定的url值,附帶參數ticket=ST值。
3. 用戶再次訪問必聯網受保護資源。帶上參數值ticket=ST。必聯網應用中的過濾器檢測到帶有該參數后,會將參數service和ticket的值發送請求給cas的URL地址/serviceValidate。該地址會校驗ST。校驗結束后會返回一個校驗結果給客戶端應用,如果正確則會返回登錄的用戶名。客戶端應用則會在本應用為該用戶執行登錄后處理,如加載用戶信息和權限等放入到session中。至此登錄完成。
4. 考慮用戶訪問到不同的服務器上。如用戶第一次訪問到必聯網應用節點1,第二次訪問都必聯網節點2上,由于session信息是共享的,則兩個節點是等效的。若用戶第一次訪問到cas節點1,第二次訪問cas節點2,由于session和票據信息是共享集中存儲的,用戶訪問到任意節點都是等效的,票據在任意節點都能夠得到有效地認證。
結論:該情況的流程集群不存在問題。
1.3. 統一登出流程
假設用戶A已經統一登錄過CAS服務器節點1,必聯網節點2和招標網節點1。用戶這個時候想統一登出所有系統。要經過以下流程。
1. 用戶A通過瀏覽器訪問CAS服務器節點2的登出路徑/logout。CAS服務器由于配置了集中存儲session和票據,因此可以識別該用戶的信息;首先銷毀該用戶對應的TGT和CAS服務器的session信息。然后循環退出所有的已登錄服務。
2. 退出用戶A登錄的必聯網服務。假如CAS服務調用的是必聯網節點1的登出地址,由于session共享,該節點能夠正確地退出該用戶,銷毀該用戶的session及其它登錄信息。
3. 退出用戶A登錄的招標網服務。假如CAS服務調用的是招標網節點2的登出地址,由于session共享,該節點能夠正確地退出該用戶,銷毀該用戶的session及其它登錄信息。
結論:該情況的流程集群不存在問題。