Cas_個人理解


 
 
分為三個部分
1、Cas服務器(用於驗證用戶是否正確)
        1、用戶信息存在服務端,其它客戶端應用程序修改用戶信息后需要同步到服務端
       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去訪問serviceserviceSTCAS驗證,驗證通過后,允許用戶訪問資源。
 
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()不再執行相關業務邏輯,而是直接執行后續的Filter
2、移除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) 單點登錄添加Session
    1、mappingId參數:從 request.getParameter("ticket"),為ST
    2、session參數:從 request.getSession(true)獲取
    3、HashMapBackedSessionMappingStorage-->addSessionById( String mappingId, HttpSession session )  
         繼承於: SessionMappingStorage

          ST示例: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刪除session
   MANAGED_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的業務,在過濾器中已經執行過了,所有不用再次執行

 

 

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM