1. 程式人生 > >CAS集成源碼解析

CAS集成源碼解析

str https 會話 auth 理解 處理 ng- rate remote

CAS是其中一種SSO(單點登錄)的實現,可以用做企業單點登錄系統的集成。

CAS主要分為兩個部分cas-server和cas-client,分別是集成在服務端(中央票據校驗)和客戶端(集成應用的子系統)。在應用改造層面,要先了解cas-server和cas-client的主要類和基本實現構架。

技術分享圖片

先從cas-client說起,cas-client主要要做的集成工作就是引入cas客戶端的依賴,然後在web.xml中配置過濾器,過濾器會根據url來對來到cas-client的請求進行處理(轉發或者直接進入系統)。對於cas-client的代碼改造工作也大部分會在這幾個過濾器中完成,在裏面加入自己的業務需求。

web.xml有四個比較關鍵的過濾器:SingleSignOutFilter,CasAuthenticationFilter,Cas20ProxyReceivingTicketValidationFilter(cas20指的是用cas2.0協議,不同版本的cas這個類會不同),HttpServletRequestWrapperFilter;

1. SingleSignOutFilter 這個類放在第一個,判斷url是否為登出請求,會做出一些清除票據信息和登錄信息的操作;(為什麽這個類要放在第一個?個人理解:如果是登出請求,後面的過濾器幾乎完全沒有必要走了,必須轉發到cas服務器中做出申請票據什麽的);

2. CasAuthenticationFilter 這個類根據assertion是否為空來判斷是否重定向至cas服務器進行登錄驗證(可以根據自己系統的需求增加不進行攔截的url(例如放行同步,級聯,pki登錄等流程));

3. Cas20ProxyReceivingTicketValidationFilter 負責對Service Ticket的校驗工作 底層通過HttpsURLConnection來完成後臺校驗Service Ticket 然後將獲得的assertion放在會話中,方便子系統的下次跳轉;

4. HttpServletRequestWrapperFilter 這個類是一個包裝類,個人理解的不深入,有一個目的是允許通過HttpServletRequest的getRemoteUser()方法獲得SSO登錄用戶的登錄名,這個東西可以為以後的業務處理提供十分多的便利;

知道了這些入口流程類的話,一步一步往下看就比較容易了,細節之處就不深入分析了,在代碼中還是比較容易理解的;

然後看看cas-server的主要骨架,cas-server中我覺得最關鍵的地方是用了spring-mvc的web-flow,當請求url進來spring webflow之後,定義了每一步的流程,跟著這個webflow一步步看下去,cas-server的大致流程就很好理解了。Spring-webflow有以下的關鍵類:

1. AuthenticationViaFormAction 驗證登錄方式(用戶名密碼)然後生成ticketGrantingTicket(tgt 這個東西是整個單點登錄中最關鍵的)放在flow scope和Request scope中;(這兩個scope是spring mvc裏面的概念)

2. SendTicketGrantingTicketAction 將tgt放進瀏覽器的Cookie中

3. GenerateServiceTicketAction 驗證tgt的有效性 根據tgt和service(cas-client子系統)生成Service Ticket

掌握了這些cas的至關重要的入口類之後,繼續深入研究cas也會變得更加容易了。

由於直接這麽描述源碼會比較抽象,對cas的用法也難以理解,會另開一文來總結一下cas的大致流程。

CAS集成源碼解析