您好,登錄后才能下訂單哦!
你有沒有遇到過公司每一個產品,都要開發一個用戶系統,浪費開發成本不說,用戶體驗還不好,用戶要記住每一個產品的用戶密碼,每個產品都要重復登錄,問題重重,要是能登錄一次別的一些列產品就都登錄了那該多好,SSO(Single Sign On)單點登錄,能幫你解決這些問題。
我在這里來說一下單點登錄實現原理,希望能讓大家對單點登錄更了解,并應用之。我這里以phpCAS的例子來說講解。
首先我們想到單點登錄可能是通過在根域下設置一個cookie,然后只要在這個域下的都可以共享cookie,這種方式最大的問題就是不能實現跨域(雖然網上有很多跨域的解決方案,比如header方式,但是各個瀏覽器支持的都不是很好),并且很不安全。所以CAS實現了另一種方式——cas server和cas client分離,也就是說單點登錄服務器單獨部署,其他client調用它,從而實現單點登錄。具體流程如下圖
1、瀏覽器訪問單點登錄的網站,如果session存在就返回數據,如果不存在就跳轉到cas server(一個單獨域名的服務)
2、如果有已經登錄過,通過檢測cookie,cas server就會302跳轉通過url返回Ticket(Ticket是隨機且唯一)到網站,如果沒有登錄過,就跳轉到cas server登錄頁面進行登錄,登錄成功設置cookie,然后302跳轉返回Ticket到網站,同時cas server會存儲改Ticket、cookie和網站host的對應關系。
3、 網站接收到Ticket后通過cas server提供的校驗url去校驗Ticket,cas server確認后返回成功,網站把當前的sessionid換成Ticket(session_id(Ticket)),然后返回瀏覽器請求數據
4、當用戶再訪問網站的時候,就會判斷當前session是否登錄
單點登錄就說完了,其實沒有太復雜的技術,主要是實現的思想,說完單點登錄大家一定想知道的是如何單點登出呢?接下來我再分析一下單點登出的原理:
1、用戶點擊登出,網站先清除當前網站的session信息,然后跳轉到cas server退出URL
2、cas server接收到登出請求后刪除cookie或session信息,并且通過單點登錄時候記錄的cookie和host、Ticket對應關系,遍歷host給網站發送post登出請求(這里有一個Tip,就是在cas server退出頁面通過iframe等方式把向所有host發出退出請求)
3、網站接收到登出請求后,獲取Ticket,并且把Ticket換成當前的sessionid,模擬用戶登錄,然后銷毀session完成登出
以上是本人通過研究phpCAS獲得的結論,這個只是最基本的模式,還有很多復雜模式,比如代理模式等等,有經驗的朋友歡迎交流!
謝謝!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。