CAS總結之Ticket篇(轉,非常詳細,後文還提到一個ppt,非常易懂)
一 名詞解釋
- 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,然後才能訪問到此應用。
二 程式碼解析
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 總結之協議分析篇(http://zhenkm0507.iteye.com/blog/546822),裡面的動畫演示比較清楚地表達了 Client 、 Service 、 CAS 三者之間的互動。
CAS是怎麼操作的呢?或則是KRB(Kerberos)怎麼操作的呢?
他並不是很複雜,他先是建立一個 專門認證使用者的 服務(SERVER) 這個服務只做一件事,負責驗證使用者的ID和PASS 是否是正確,在正確的情況提供使用者一個名為TGT的票據,
相當你要去遊樂場玩,首先你要在門口檢查你的身份(即CHECK 你的ID和PASS),如果你通過驗證,遊樂場的門衛(AS)即提供給你一張門卡(TGT).
這張卡片的用處就是告訴 遊樂場的各個場所,你是通過正門進來,而不是後門偷爬進來的,並且也是獲取進入場所一把鑰匙.
好的,現在你有張卡,但是這對你來不重要,因為你來遊樂場不是為了拿這張卡的,好的,我們向你的目的出發, 恩,你來到一個摩天樓,你想進入玩玩,
這時摩天輪的服務員(client)攔下你,向你要求摩天輪的(ST)票據,你說你只有一個門卡(TGT),好的,那你只要把TGT放在一旁的票據授權機(TGS)上刷一下,
票據授權機(TGS)就根據你現在所在的摩天輪,給你一張摩天輪的票據(ST),哈,你有摩天輪的票據, 現在你可以暢通無阻的進入摩天輪裡遊玩了.
當然如果你玩完摩天輪後,想去遊樂園的咖啡廳休息下,那你一樣只要帶著那張門卡(TGT).到相應的咖啡廳的票據授權機(TGS)刷一下,得到咖啡廳的票據(ST)就可以進入咖啡廳
當你離開遊樂場後,想用這張TGT去刷打的回家的費用,呵呵,對不起,你的TGT已經過期了,在你離開遊樂場那刻開始,你的TGT就已經銷燬了~
Service ticket(ST) --------- 服務票據, 由KDC 的 TGS 發放。 任何一臺Workstation 都需要擁有一張有效的 Service Ticket 才能訪問域內部的應用(Applications)。
Ticket Granting tieckt(TGT) --------- 票據授權票據,由 KDC 的 AS 發放。即獲取這樣一張票據後,以後申請各種其他服務票據(ST)便不必再向KDC 提交身份認證資訊(準確術語是 Credentials)。
authentication service (AS) --------- 認證用服務,索取 Crendential,發放 TGT
ticket-granting service (TGS) --------- 票據授權服務,索取 TGT,發放 ST