CAS

上面是CAS 基礎協議圖
CAS 具有以下特點:
- 開源的企業級單點登錄解決方案。
- CAS Server 為需要獨立部署的 Web 應用。
- CAS Client 支持非常多的客戶端(這里指單點登錄系統中的各個 Web 應用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
CAS Client 與受保護的客戶端應用部署在一起,以 Filter 方式保護受保護的資源。對于訪問受保護資源的每個 Web 請求,CAS Client 會分析該請求的 Http 請求中是否包含 Service Ticket,如果沒有,則說明當前用戶尚未登錄,于是將請求重定向到指定好的 CAS Server 登錄地址,并傳遞 Service (也就是要訪問的目的資源地址),以便登錄成功過后轉回該地址。用戶在第 3 步中輸入認證信息,如果登錄成功,CAS Server 隨機產生一個相當長度、唯一、不可偽造的 Service Ticket,并緩存以待將來驗證,之后系統自動重定向到 Service 所在地址,并為客戶端瀏覽器設置一個 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新產生的 Ticket 過后,在第 5,6 步中與 CAS Server 進行身份合適,以確保 Service Ticket 的合法性。
在該協議中,所有與 CAS 的交互均采用 SSL 協議,確保,ST 和 TGC 的安全性。協議工作過程中會有 2 次重定向的過程,但是 CAS Client 與 CAS Server 之間進行 Ticket 驗證的過程對于用戶是透明的。
另外,CAS 協議中還提供了 Proxy (代理)模式,以適應更加高級、復雜的應用場景,具體介紹可以參考 CAS 官方網站上的相關文檔。
在 Tomcat 上部署一個完整的 CAS Server 主要按照以下幾個步驟:
如果希望 Tomcat 支持 Https,主要的工作是配置 SSL 協議,其配置過程和配置方法可以參考 Tomcat 的相關文檔。不過在生成證書的過程中,會有需要用到主機名的地方,CAS 建議不要使用 IP 地址,而要使用機器名或域名。(項目過程中沒使用)
CAS Server 是一個 Web 應用包,將前面下載的 cas-server-3.1.1-release.zip 解開,把其中的 cas-server-webapp-3.1.1.war 拷貝到 tomcat的 webapps 目錄,并更名為 cas.war。由于前面已配置好 tomcat 的 https 協議,可以重新啟動 tomcat,然后訪問:https://localhost:8443/cas(沒配置ssh應該是http://localhost:8080/cas) ,如果能出現正常的 CAS 登錄頁面,則說明 CAS Server 已經部署成功。
雖然 CAS Server 已經部署成功,但這只是一個缺省的實現,在實際使用的時候,還需要根據實際概況做擴展和定制,最主要的是擴展認證 (Authentication) 接口和 CAS Server 的界面。
參考http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/index.html項目也采用jdbc驗證,文章介紹了三個基于 JDBC 的 AuthenticationHandler,我使用的cas-server 3.3 多了一個AbstractJdbcUsernamePasswordAuthenticationHandler 直接使用。
單點登錄的目的是為了讓多個相關聯的應用使用相同的登錄過程,使用的是cas-client-core- 3.1.9.jar 放入要使用單點登錄項目的lib下。cas客戶端使用的是過濾器,在web.xml配置。可以使用spring配置bean。官方網站http://www.ja-sig.org/wiki/display/CASC/Configuring+the+JA- SIG+CAS+Client+for+Java+using+Spring 有配置。
用類擴展 Cas20ProxyReceivingTicketValidationFilter復寫onSuccessfulValidation方法,寫入驗證成功后做的事情,比如把用戶信息放入session。寫了一個a.jsp用于跳轉,過濾器針對他,訪問這個頁面的時候,會到cas服務器端,如果成功的話,返回到a.jsp,這個頁面用sendRedirect調用了一個action方法處理登錄成功后直接進入項目首頁。
posted on 2009-11-12 20:57 yuxh 閱讀(1266) 評論(0) 編輯 收藏 所屬分類: j2ee