CAS整合原始碼解析
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的大致流程。