1、流程說明html
第一步:訪問cas過濾連接ssoLogin,拼湊定向到 CAS_SERVER 獲取ticket的URL
第二步:CAS_SERVER校驗用戶信息,生成Ticket
第三步:從新定向到訪問客戶端的ssoLogin並附加Ticket參數和值
第四步:根據傳來的Ticket拼湊定向到CAS_SERVER的鏈接去校驗Ticket的合法性
第五步:CAS_SERVER校驗成功後,會返回XML報文並從新定向到訪問客戶端的ssoLogin
解析該XML報文,構造用戶信息對象存儲在session中
而後根據ssoLogin設置的loginSuccessUrl跳轉到登陸成功後的訪問頁面
2、具體步驟 java
一、導入所需依賴jar包web
二、在web.xml中配置須要單點登陸過濾的路徑爲/ssoLogin服務器
本地客戶端URL:http://localhost:8080/webtest/ssoLogin
遠程cas服務器地址CAS_LOGIN_URL:https://192.168.6.100/ptyhzx-sso/login
web.xml配置session
ssoclient.properties配置ui
三、流程剖析編碼
(1) 訪問ssoLogin[處理類:SSOServlet]帶上用戶名和密碼 - requestUrl加密
https://localhost:8080/webtest/ssoLogin?username=user1&password=123456
(2) 構造第一次訪問CAS_SERVER的getTicketURLspa
getTicketURL = CAS_LOGIN_URL ? SERVICE參數.net
目的:獲取TICKET
http://192.168.6.100/ptyhzx-sso/login?service=http%3A%2F%2Flocalhost%3A8080%2Fwebtest%2FssoLogin%3Frenew=true&other=form&accessToken=C45BD9AE005909FE2F9EC45D54FF70D2ADD106142B17461AEC94AD4A098A7420025D7694680916B5276CDDE8FA085C5A
說明:
後臺根據 requestUrl 構造 service 參數
service的值 = 去掉用戶名密碼後的requestUrl參數 + renew參數 + other參數 + 用戶名密碼加密後的accessToken
拼接完畢後再對service總體編碼做爲最終的service值
構造獲取getTicektURL完畢後馬上重定向到該URL去
(3) CAS_SERVER根據accessToken驗證用戶信息
驗證成功
一、生成TOKEN【示例:ST-5649-Wv3HsI75tG7dNzEu9Uxg-cas01.example.org】
二、重定向到requestURL,此時requestURL中包含了ticket參數
http://localhost:8080/webtest/ssoLogin;jsessionid=DBFC81A7ECA2C24C90B2AB5440475E05&ticket=ST-5649-Wv3HsI75tG7dNzEu9Uxg-cas01.example.org
驗證失敗,跳轉到配置的loginFailureURL並提示具體錯誤信息
(4) 根據獲得的ticket調用驗證方法:
Assertion vaildAssertion = ticketValidator.validate(ticket,requestURL);
調用validate方法會構造驗證的 validURL 去CAS服務器驗證這個TICKET是否合法
validateURL =
CAS_SERVER_URL/serviceValidate? + ticket參數 + serviceCode參數 + service參數
service參數是驗證成功後重定向的URL地址
http://192.168.6.100/ptyhzx-sso/serviceValidate?ticket=ST-5653-dURt1ErNHUuEm9j3vsqe-cas01.example.org&serverCode=101&service=http%3A%2F%2Flocalhost%3A8080%2Fwebtest%2FssoLogin
String serverResponse = retrieveResponseFromServer(new URL(validationUrl), ticket);
(6)驗證成功後cas_server會返回xml報文到重定向的URL地址
<!-- 成功時 --> <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> <cas:authenticationSuccess> <cas:user>a1</cas:user> <cas:attributes> <cas:id>1100000000000000000</cas:id> <cas:sex>1</cas:sex> <cas:username></cas:username> <cas:authenticationMethod>com.jeaw.sso.adaptors.jdbc.QueryDatabaseAuthenticationHandler</cas:authenticationMethod> <cas:email></cas:email> <cas:nickname>a1</cas:nickname> <cas:status>1</cas:status> <cas:cellphone></cas:cellphone> <cas:usertype>03</cas:usertype> <cas:loginid>1000000001</cas:loginid> <cas:password>111111</cas:password> </cas:attributes> </cas:authenticationSuccess> </cas:serviceResponse> <!-- 失敗時 --> <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> <cas:authenticationFailure code='INVALID_TICKET'> 未可以識別出目標 'ST-136-Tnw7BLEKurYGcDaZFgo6-cas01.example.org'票根 </cas:authenticationFailure> </cas:serviceResponse>
(7) 後續操做
一、調用parseResponseFromServer(serverResponse)解析該報文以生成 Assertion 對象
vaildAssertion
二、構造用戶信息對象存於session
request.getSession().setAttribute("userInfo",vaildAssertion);
三、跳轉到登錄成功頁面
response.sendRedirect(loginSuccessUrl);
(8) 交互流程一覽
(9)參考文檔