安全性:web
用戶只須在cas錄入用戶名和密碼,以後經過ticket綁定用戶,在cas客戶端與cas校驗是經過ticket,並不會在網上傳輸密碼,因此能夠保證安全性,密碼不被竊取數據庫
原理:1個cookie+N個session瀏覽器
CAS建立cookie在全部應用中登陸時cas使用,各應用經過在IE建立各自的session來標識應用是否已經登陸。安全
Cookie:在cas爲各應用登陸時使用,實現了只須一次錄入用戶密碼服務器
Session:各應用會建立本身的session表示是否登陸cookie
1. CAS 登陸時處理:session
第一步:cas往瀏覽器增長cookie(TGC)app
CAS向瀏覽器送回一個所謂的「內存cookie」。這種cookie並非真的保存在內存中,而只是瀏覽器一關閉,cookie就自動過時。這個cookie稱爲「ticket-granting cookie」,用來代表用戶已經成功地登陸。this
這個Cookie是一個加密的Cookie,其中保存了用戶登陸的信息。用於之後其它應用客戶端登陸。加密
第二步:cas同時建立一個ticket重定向到原來的cas客戶端
認證成功後,CAS服務器建立一個很長的、隨機生成的字符串,稱爲「Ticket」。隨後,CAS將這個ticket和成功登陸的用戶,以及服務聯繫在一塊兒。這個ticket是一次性使用的一種憑證,它只對登陸成功的用戶及其服務使用一次。使用過之後馬上失效。
2. Cas 客戶端應用A的處理
第一步:收到ticket後,向cas提交驗證ticket
Cas客戶端收到ticket以後,應用程序須要驗證ticket。這是經過將ticket 傳遞給一個校驗URL來實現的。校驗URL也是CAS服務器提供的。CAS經過校驗路徑得到了ticket以後,經過內部的數據庫對其進行判斷。若是判斷是有效性,則返回一個NetID給應用程序。隨後CAS將ticket做廢,而且在客戶端留下一個cookie。(誰來建立cookie?),
第二步:ticket驗證後建立session
之後登陸此應用時,沒有ticket,但IE能提供session,從session中取得CASReceipt,並驗證若是有效說明已經在此應用認證過,容許訪問此應用,
到此爲止,CAS會記錄用戶已在應用A已經登陸
3. 用戶登陸到應用B是如何處理
用戶進入應用B時,首先仍然會重定向到CAS服務器。不過此時CAS服務器再也不要求用戶輸 入用戶名和密碼,而是首先自動尋找Cookie,根據Cookie中保存的信息,進行登陸。而後,CAS一樣給出新的ticket重定向應用B給cas驗證(流程同應用A驗證方式),若是驗證成功則應用B建立session記錄CASReceipt信息到session中,之後憑此session登陸應用B。
到此爲止,CAS會記錄用戶已在應用A和應用B進行登陸,可是當用戶在應用B退出cas登陸時,要通知應用A進行退出,如何通知應用A呢?
CAS server接受請求後,會檢測用戶的TCG Cookie,把對應的session清除,同時會找到全部經過該TGC sso登陸的應用服務器URL提交請求,全部的回調請求中,包含一個參數logoutRequest,內容格式以下:
全部收到請求的應用服務器application會解析這個參數,取得sessionId,根據這個Id取得session後,把session刪除。
這樣就實現單點登出的功能。
首先,要實現single sign out在 應用服務器application端的web.xml要加入如下配置
注:若是有配置CAS client Filter,則CAS Single Sign Out Filter 必需要放到CAS client Filter以前。
配置部分的目的是在CAS server回調全部的application進行單點登出操做的時候,須要這個filter來實現session清楚。
看了下面的瀏覽器cookie變化,會對cas有更深的理解
下載個httpwatch監控一下cookie的變化
1. 第一次訪問http://localhost:8080/a,
CLIENT:沒票據且SESSION中沒有消息因此跳轉至CAS
CAS:拿不到TGC故要求用戶登陸
2. 認證成功後回跳
CAS:經過TGT生成ST發給客戶端,客戶端保存TGC,並重定向到http://localhost:8080/a
CLIENT:帶有票據因此不跳轉只是後臺發給CAS驗證票據(瀏覽器中沒法看到這一過程)
3. 第一次訪問http://localhost:8080/b
CLIENT:沒票據且SESSION中沒有消息因此跳轉至CAS
CAS:從客戶端取出TGC,若是TGC有效則給用戶ST並後臺驗證ST,從而SSO。【若是失效重登陸或註銷時,怎麼通知其它系統更新SESSION信息呢??TicketGrantingTicketImpl類grantServiceTicket方法裏this.services.put(id,service);可見CAS端已經記錄了當前登陸的子系統】
4. 再次訪問http://localhost:8080/a
CLIENT:沒票據可是SESSION中有消息故不跳轉也不用發CAS驗證票據,容許用戶訪問