CAS總結之Ticket篇

2021-09-01 22:41:56 字數 3566 閱讀 3909

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...