分為三個部分:
1、Cas服務器(用於驗證用戶是否正確)
1、用戶信息存在服務端,其它客戶端應用程序修改用戶信息后需要同步到服務端
2、用戶信息一般存儲在服務端的數據庫中,加密及驗證算法Cas提供默認方法
2、用戶信息一般存儲在服務端的數據庫中,加密及驗證算法Cas提供默認方法
2、Cas客戶端(和應用程序合為一體)
3、客戶端(一般是用戶使用的web瀏覽器)
名詞解釋
1、
ST:Server
Ticket(就是Ticket)
ST
是CAS為用戶簽發的訪問某一service的票據。用戶訪問service時,service發現用戶沒有ST,則要求用戶去CAS獲取ST。用戶向CAS發出獲取ST的請求,如果用戶的請求中包含cookie,則CAS會以此cookie值為key查詢緩存中有無TGT,如果存在TGT,則用此TGT簽發一個ST,返回給用戶。用戶憑借ST去訪問service,service拿ST去CAS驗證,驗證通過后,允許用戶訪問資源。
2、
TGC:Ticket Granted
Cookie (客戶端用戶持有,傳送到服務器,用於驗證)
存放用戶身份認證憑證的cookie,在瀏覽器和CAS Server間通訊
時使用,並且只能基於安全通道傳輸(Https),是CAS Server用來明確用戶身份的憑證。
3、
TGT(Ticket Grangting Ticket)
TGT是CAS為用戶簽發的登錄票據,擁有了TGT,用戶就可以證明自己在CAS成功登錄過。
TGT封裝了Cookie值以及此Cookie值對應的用戶信息。
用戶在CAS認證成功后,CAS生成cookie(叫TGC),寫入瀏覽器,同時生成一個TGT對象,放入自己的緩存,TGT對象的ID就是cookie的值。當HTTP再次請求到來時,如果傳過來的有CAS生成的cookie,則CAS以此cookie值為key查詢緩存中有無TGT ,如果有的話,則說明用戶之前登錄過,如果沒有,則用戶需要重新登錄。
Cas客戶端主要的幾個Filter
1、AuthenticationFilter
a)驗證session是否有值(用戶數據放在session中)b)驗證是否有ticket(不驗證其正確性)
2、TicketValidationFilter
a)驗證ticket是否正確
b)ticket只是用一次
3、AssertionThreadLocalFilter
a)
AssertionThreadLocalFilter作用很簡單,就是將
Assertion綁定到ThreadLocal
c) 項目中可獲取userInfo、roleInfo並存儲在session中
(從assertion中獲取loginName)
4、單點登錄(SingleSignOutFilter、SingleSignOutHttpSessionListener)
a)功能:登錄過濾器、監聽器
b)
先執行:SingleSignOutFilter-->doFilter()-->
recordSession
SingleSignOutHandler-->
recordSession
()
1、從request中獲取token,key值為:" ticket"
這個Ticket只有在第一次跳轉到本應用時才有值,以后取值都為null,以后進入其他頁面時SingleSignOutFilter.doFilter()不再執行相關業務邏輯,而是直接執行后續的Filter2、移除session: this.sessionMappingStorage.removeBySessionById(session.getId());3、添加session、mapping、sessionId關系
ID_TO_SESSION_KEY_MAPPING.put(session.getId(), mappingId); //這里理解為存儲sessionId和ST(mappingId)的對應關系MANAGED_SESSIONS.put(mappingId, session); //這里理解為ST(mappingId)和session的對應關系c)再執行SingleSignOutHttpSessionListener--> sessionCreated () 不做任何處理
d) 單點登錄添加Session1、mappingId參數:從 request.getParameter("ticket"),為ST2、session參數:從 request.getSession(true)獲取3、HashMapBackedSessionMappingStorage-->addSessionById( String mappingId, HttpSession session )繼承於: SessionMappingStorageST示例:ST-23573-vwXU4ej0zAAYfmexmiyL-sso.cycore.cn(mappingId就是ST)
SessionId示例:kpyo6wtprbr01asqgu9d5cvgm
4、 進入時間:通過CAS服務器登錄后,進入本應用系統的某個頁面
5、單點登出(SingleSignOutFilter、SingleSignOutHttpSessionListener)
a)功能:登出過濾器、監聽器
b)
先執行:SingleSignOutFilter-->doFilter()-->
destroySession
SingleSignOutHandler-->destroySession()
1、執行HashMapBackedSessionMappingStorage-->removeBySessionById刪除sessionMANAGED_SESSIONS.remove(key);ID_TO_SESSION_KEY_MAPPING.remove(sessionId);2、執行session.invalidate() 【SingleSignOutHandler-->destroySession()】
c)再執行SingleSignOutHttpSessionListener-->sessionDestroyed()內部刪除session方法MANAGED_SESSIONS.remove(key);ID_TO_SESSION_KEY_MAPPING.remove(sessionId);
d) 根據b、c來看,監聽器清除session的業務,在過濾器中已經執行過了,所有不用再次執行