一、流程說明
第一步:訪問cas過濾鏈接ssoLogin,拼湊定向到 CAS_SERVER 獲取ticket的URL
第二步:CAS_SERVER校驗用戶信息,生成Ticket
第三步:重新定向到訪問客戶端的ssoLogin並附加Ticket參數和值
第四步:根據傳來的Ticket拼湊定向到CAS_SERVER的連接去校驗Ticket的合法性
第五步:CAS_SERVER校驗成功后,會返回XML報文並重新定向到訪問客戶端的ssoLogin
解析該XML報文,構造用戶信息對象存儲在session中
然后根據ssoLogin設置的loginSuccessUrl跳轉到登錄成功后的訪問頁面
二、具體步驟
1、導入所需依賴jar包
2、在web.xml中配置需要單點登錄過濾的路徑為/ssoLogin
本地客戶端URL:http://localhost:8080/webtest/ssoLogin
遠程cas服務器地址CAS_LOGIN_URL:https://192.168.6.100/ptyhzx-sso/login
web.xml配置
ssoclient.properties配置
3、流程剖析
(1) 訪問ssoLogin[處理類:SSOServlet]帶上用戶名和密碼 - requestUrl
https://localhost:8080/webtest/ssoLogin?username=user1&password=123456
(2) 構造第一次訪問CAS_SERVER的getTicketURL
getTicketURL = CAS_LOGIN_URL ? SERVICE參數
目的:獲取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驗證用戶信息
驗證成功
1、生成TOKEN【示例:ST-5649-Wv3HsI75tG7dNzEu9Uxg-cas01.example.org】
2、重定向到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) 后續操作
1、調用parseResponseFromServer(serverResponse)解析該報文以生成 Assertion 對象
vaildAssertion
2、構造用戶信息對象存於session
request.getSession().setAttribute("userInfo",vaildAssertion);
3、跳轉到登陸成功頁面
response.sendRedirect(loginSuccessUrl);
(8) 交互流程一覽
(9)參考文檔
基於CAS實現單點登錄(SSO):登錄成功后,cas client如何返回更多用戶信息