PHP成長記(三) —— SSO單點登錄/登出

      你有沒有遇到過公司每一個產品,都要開發一個用戶系統,浪費開發成本不說,用戶體驗還不好,用戶要記住每一個產品的用戶密碼,每個產品都要重複登錄,問題重重,要是能登錄一次別的一些列產品就都登錄了那該多好,SSO(Single Sign On)單點登錄,能幫你解決這些問題。

      我在這裏來說一下單點登錄實現原理,希望能讓大家對單點登錄更瞭解,並應用之。我這裏以phpCAS的例子來說講解。

      首先我們想到單點登錄可能是通過在根域下設置一個cookie,然後只要在這個域下的都可以共享cookie,這種方式最大的問題就是不能實現跨域(雖然網上有很多跨域的解決方案,比如header方式,但是各個瀏覽器支持的都不是很好),並且很不安全。所以CAS實現了另一種方式——cas server和cas client分離,也就是說單點登錄服務器單獨部署,其他client調用它,從而實現單點登錄。具體流程如下圖

       wKioL1LmEoXAB32OAAKlQIXqKhA161.jpg


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是否登錄


       單點登錄就說完了,其實沒有太複雜的技術,主要是實現的思想,說完單點登錄大家一定想知道的是如何單點登出呢?接下來我再分析一下單點登出的原理:

       wKiom1LmGDLTq923AAG-XpjR3Fo623.jpg

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獲得的結論,這個只是最基本的模式,還有很多複雜模式,比如代理模式等等,有經驗的朋友歡迎交流!

                                                                                                                                                                                                       謝謝!




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章