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 ,若是有的話,則說明用戶以前登陸過,若是沒有,則用戶須要從新登陸。cookie
ST(Service Ticket)ide
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)this
Proxy Service的代理憑據。用戶經過CAS成功登陸某一Proxy Service後,CAS生成一個PGT對象,緩存在CAS本地,同時將PGT的值(一個UUID字符串)回傳給Proxy Service,並保存在Proxy Service裏。Proxy Service拿到PGT後,就能夠爲Target Service(back-end service)作代理,爲其申請PT。url
PGTIOU(Proxy Granting Ticket IOU)3d
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 總結之協議分析篇,裏面的動畫演示比較清楚地表達了 Client 、 Service 、 CAS 三者之間的交互。