[sso] 單點登錄認證流程


一、流程說明

第一步:訪問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'>
        未能夠識別出目標 &#039;ST-136-Tnw7BLEKurYGcDaZFgo6-cas01.example.org&#039;票根
    </cas:authenticationFailure>
</cas:serviceResponse>

 

(7) 后續操作

1、調用parseResponseFromServer(serverResponse)解析該報文以生成 Assertion 對象 
  vaildAssertion 2、構造用戶信息對象存於session   request.getSession().setAttribute("userInfo",vaildAssertion); 3、跳轉到登陸成功頁面   response.sendRedirect(loginSuccessUrl);

 

(8) 交互流程一覽

 

(9)參考文檔

單點登錄SSO的實現原理

CAS實現SSO單點登錄原理

類 Cas20ServiceTicketValidator

基於CAS實現單點登錄(SSO):登錄成功后,cas client如何返回更多用戶信息

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM