cas的核心就是其ticket,及其在ticket之上的一系列處理操作。cas的主要票據有tgt、st、pgt、pgtiou、pt,其中tgt、st是cas1.0協議中就有的票據,pgt、pgtiou、pt是cas2.0協議中有的票據。
一 名詞解釋
tgt(ticket grangting ticket)
tgt是cas為使用者簽發的登入票據,擁有了tgt,使用者就可以證明自己在cas成功登入過。tgt封裝了cookie值以及此cookie值對應的使用者資訊。使用者在cas認證成功後,cas生成cookie,寫入瀏覽器,同時生成乙個tgt物件,放入自己的快取,tgt物件的id就是cookie的值。當http再次請求到來時,如果傳過來的有cas生成的cookie,則cas以此cookie值為key查詢快取中有無tgt ,如果有的話,則說明使用者之前登入過,如果沒有,則使用者需要重新登入。
st(service ticket)
st是cas為使用者簽發的訪問某一service的票據。使用者訪問service時,service發現使用者沒有st,則要求使用者去cas獲取st。使用者向cas發出獲取st的請求,如果使用者的請求中包含cookie,則cas會以此cookie值為key查詢快取中有無tgt,如果存在tgt,則用此tgt簽發乙個st,返回給使用者。使用者憑藉st去訪問service,service拿st去cas驗證,驗證通過後,允許使用者訪問資源。
pgt(proxy granting ticket)
proxy service的**憑據。使用者通過cas成功登入某一proxy service後,cas生成乙個pgt物件,快取在cas本地,同時將pgt的值(乙個uuid字串)回傳給proxy service,並儲存在proxy service裡。proxy service拿到pgt後,就可以為target service(back-end service)做**,為其申請pt。
pgtiou(proxy granting ticket iou)
pgtiou是cas協議中定義的一種附加票據,它增強了傳輸、獲取pgt的安全性。
pgt的傳輸與獲取的過程:proxy service呼叫cas的servicevalidate介面驗證st成功後,cas首先會訪問pgturl指向的https url,將生成的 pgt及pgtiou傳輸給proxy service,proxy service會以pgtiou為key,pgt為value,將其儲存在map中;然後cas會生成驗證st成功的xml訊息,返回給proxy service,xml訊息中含有pgtiou,proxy service收到xml訊息後,會從中解析出pgtiou的值,然後以其為key,在map中找出pgt的值,賦值給代表使用者資訊的assertion物件的pgtid,同時在map中將其刪除。
pt(proxy ticket)
pt是使用者訪問target service(back-end service)的票據。如果使用者訪問的是乙個web應用,則web應用會要求瀏覽器提供st,瀏覽器就會用cookie去cas獲取乙個st,然後就可以訪問這個web應用了。如果使用者訪問的不是乙個web應用,而是乙個c/s結構的應用,因為c/s結構的應用得不到cookie,所以使用者不能自己去cas獲取st,而是通過訪問proxy service的介面,憑藉proxy service的pgt去獲取乙個pt,然後才能訪問到此應用。
st/pt安全性
cas通過以下幾個方面讓service ticket更加安全.
st只能使用一次.
cas協議規定,無論service ticket驗證是否成功, cas server都會將在服務端的快取中的此st清除.
st在一段時間內失效.
cas規定service ticket只能存活一定的時間,然後cas server會讓它失效.
st是基於隨機數生成的.
service ticket必須足夠隨機化,盡可能做到其生成規則無法被猜出.
二 **解析
cas ticket類圖
ticketgrantingticket 的 grantserviceticket方法
方法宣告:public synchronized serviceticket grantserviceticket(final string id,final service service, final expirationpolicy expirationpolicy, final boolean credentialsprovided)
方法描述:
1:生成serivceticketimpl
2:更新屬性:
this.previouslasttimeused = this.lasttimeused;
this.lasttimeused = system.currenttimemillis();
this.countofuses++;
3:給service物件的principal屬性賦值
4:將service物件放入map services
serviceticket 的 grantticketgrantingticket方法
方法宣告:
public ticketgrantingticket grantticketgrantingticket(final string id, final authentication authentication,final expirationpolicy expirationpolicy)
方法描述:在cas3.3對cas2.0協議的實現中,pgt是由st簽發的,呼叫的就是serviceticket的grantticketgrantingticket方法。方法返回的ticketgrantingticket物件,表徵的是乙個pgt物件,其中的ticketgrantingticket屬性的值是簽發st的tgt物件。
ticketgrantingticket 的 expire方法
方法宣告:void expire()
方法描述:
在cas的logout介面實現中,要呼叫tgt物件的expire方法,然後會在快取中清除此tgt物件。
expire方法的內容:迴圈遍歷 services 中的service物件,呼叫其logoutofservice方法。具體service實現類中的logoutofservice方法的實現,要通知具體的應用,客戶要退出。
tgt、st、pgt、pt之間關係的總結
1:st是tgt簽發的。使用者在cas上認證成功後,cas生成tgt,用tgt簽發乙個st,st的ticketgrantingticket屬性值是tgt物件,然後把st的值redirect到客戶應用。
2:pgt是st簽發的。使用者憑藉st去訪問proxy service,proxy service去cas驗證st(同時傳遞pgturl引數給cas),如果st驗證成功,則cas用st簽發乙個pgt,pgt物件裡的ticketgrantingticket是簽發st的tgt物件。
3:pt是pgt簽發的。proxy service**back-end service去cas獲取pt的時候,cas根據傳來的pgt引數,獲取到pgt物件,然後呼叫其grantserviceticket方法,生成乙個pt物件。
tgt、st、pgt、pt之間的關聯關係
注:如果本文中介紹的 ticket 概念不詳細,請參考本人的另一篇文章 cas 總結之協議分析篇,裡面的動畫演示比較清楚地表達了 client 、 service 、 cas 三者之間的互動。
CAS總結之Ticket篇
器 webxml cas的核心就是其ticket,及其在ticket之上的一系列處理操作。cas的主要票據有tgt st pgt pgtiou pt,其中tgt st是cas1.0協議中就有的票據,pgt pgtiou pt是cas2.0協議中有的票據。一 名詞解釋 tgt是cas為使用者簽發的登入...
原創 CAS總結之Ticket篇
cas的核心就是其ticket,及其在ticket之上的一系列處理操作。cas的主要票據有tgt st pgt pgtiou pt,其中tgt st是cas1.0協議中就有的票據,pgt pgtiou pt是cas2.0協議中有的票據。一 名詞解釋 tgt是cas為使用者簽發的登入票據,擁有了tgt...
cas入門之二十五 ticket清理器
當ticket儲存器,沒有能力管理ticket的狀態時,則需要ticket清理器。預設的記憶體ticket儲存器,jpa儲存器等都需要ticket清理器 memecached ehcache等儲存器則不需要ticket清理器。預設情況下,ticket 清理器配置在cas web inf spring...