你有沒有遇到過公司每一個(gè)產(chǎn)品,都要開發(fā)一個(gè)用戶系統(tǒng),浪費(fèi)開發(fā)成本不說,用戶體驗(yàn)還不好,用戶要記住每一個(gè)產(chǎn)品的用戶密碼,每個(gè)產(chǎn)品都要重復(fù)登錄,問題重重,要是能登錄一次別的一些列產(chǎn)品就都登錄了那該多好,SSO(Single Sign On)單點(diǎn)登錄,能幫你解決這些問題。
創(chuàng)新互聯(lián),專注為中小企業(yè)提供官網(wǎng)建設(shè)、營銷型網(wǎng)站制作、自適應(yīng)網(wǎng)站建設(shè)、展示型網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)等服務(wù),幫助中小企業(yè)通過網(wǎng)站體現(xiàn)價(jià)值、有效益。幫助企業(yè)快速建站、解決網(wǎng)站建設(shè)與網(wǎng)站營銷推廣問題。
我在這里來說一下單點(diǎn)登錄實(shí)現(xiàn)原理,希望能讓大家對(duì)單點(diǎn)登錄更了解,并應(yīng)用之。我這里以phpCAS的例子來說講解。
首先我們想到單點(diǎn)登錄可能是通過在根域下設(shè)置一個(gè)cookie,然后只要在這個(gè)域下的都可以共享cookie,這種方式最大的問題就是不能實(shí)現(xiàn)跨域(雖然網(wǎng)上有很多跨域的解決方案,比如header方式,但是各個(gè)瀏覽器支持的都不是很好),并且很不安全。所以CAS實(shí)現(xiàn)了另一種方式——cas server和cas client分離,也就是說單點(diǎn)登錄服務(wù)器單獨(dú)部署,其他client調(diào)用它,從而實(shí)現(xiàn)單點(diǎn)登錄。具體流程如下圖
1、瀏覽器訪問單點(diǎn)登錄的網(wǎng)站,如果session存在就返回?cái)?shù)據(jù),如果不存在就跳轉(zhuǎn)到cas server(一個(gè)單獨(dú)域名的服務(wù))
2、如果有已經(jīng)登錄過,通過檢測cookie,cas server就會(huì)302跳轉(zhuǎn)通過url返回Ticket(Ticket是隨機(jī)且唯一)到網(wǎng)站,如果沒有登錄過,就跳轉(zhuǎn)到cas server登錄頁面進(jìn)行登錄,登錄成功設(shè)置cookie,然后302跳轉(zhuǎn)返回Ticket到網(wǎng)站,同時(shí)cas server會(huì)存儲(chǔ)改Ticket、cookie和網(wǎng)站host的對(duì)應(yīng)關(guān)系。
3、 網(wǎng)站接收到Ticket后通過cas server提供的校驗(yàn)url去校驗(yàn)Ticket,cas server確認(rèn)后返回成功,網(wǎng)站把當(dāng)前的sessionid換成Ticket(session_id(Ticket)),然后返回瀏覽器請求數(shù)據(jù)
4、當(dāng)用戶再訪問網(wǎng)站的時(shí)候,就會(huì)判斷當(dāng)前session是否登錄
單點(diǎn)登錄就說完了,其實(shí)沒有太復(fù)雜的技術(shù),主要是實(shí)現(xiàn)的思想,說完單點(diǎn)登錄大家一定想知道的是如何單點(diǎn)登出呢?接下來我再分析一下單點(diǎn)登出的原理:
1、用戶點(diǎn)擊登出,網(wǎng)站先清除當(dāng)前網(wǎng)站的session信息,然后跳轉(zhuǎn)到cas server退出URL
2、cas server接收到登出請求后刪除cookie或session信息,并且通過單點(diǎn)登錄時(shí)候記錄的cookie和host、Ticket對(duì)應(yīng)關(guān)系,遍歷host給網(wǎng)站發(fā)送post登出請求(這里有一個(gè)Tip,就是在cas server退出頁面通過iframe等方式把向所有host發(fā)出退出請求)
3、網(wǎng)站接收到登出請求后,獲取Ticket,并且把Ticket換成當(dāng)前的sessionid,模擬用戶登錄,然后銷毀session完成登出
以上是本人通過研究phpCAS獲得的結(jié)論,這個(gè)只是最基本的模式,還有很多復(fù)雜模式,比如代理模式等等,有經(jīng)驗(yàn)的朋友歡迎交流!
謝謝!