溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP中實現(xiàn)SSO單點登錄的方法

發(fā)布時間:2021-07-10 09:47:05 來源:億速云 閱讀:113 作者:chen 欄目:編程語言

這篇文章主要講解了“PHP中實現(xiàn)SSO單點登錄的方法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“PHP中實現(xiàn)SSO單點登錄的方法”吧!

SSO( Single Sign On ),即單點登錄,是一種控制多個相關(guān)但彼此獨立的系統(tǒng)的訪問權(quán)限, 擁有這一權(quán)限的用戶可以使用單一的ID和密碼訪問某個或多個系統(tǒng)從而避免使用不同的用戶名或密碼,或者通過某種配置無縫地登錄每個系統(tǒng) 。

對于大型系統(tǒng)來說使用單點登錄可以減少用戶很多的麻煩。就拿百度來說吧,百度下面有很多的子系統(tǒng)——百度經(jīng)驗、百度知道、百度文庫等等,如果我們使用這些系統(tǒng)的時候,每一個系統(tǒng)都需要我們輸入用戶名和密碼登錄一次的話,我相信用戶體驗肯定會直線下降。

與 SSO 交互的2個元素:1.  用戶,2. 系統(tǒng),它的特點是:一次登錄,全部訪問。SSO 是訪問控制的一種,控制用戶能否登錄,即驗證用戶身份,而且是所有其它系統(tǒng)的身份驗證都在它這里進行,從整個系統(tǒng)層面來看 SSO ,它的核心就是這3個元素了:1. 用戶,2. 系統(tǒng),3. 驗證中心。

PHP中實現(xiàn)SSO單點登錄的方法

1、同一個域但不同的子域如何進行單點登錄

假如我們的站點是按照下面的域名進行部署的:

  • sub1.onmpw.com

  • sub2.onmpw.com

這兩個站點共享同一域 onmpw.com 。

默認情況下,瀏覽器會發(fā)送 cookie 所屬的域?qū)?yīng)的主機。也就是說,來自于 sub1.onmpw.com 的 cookie 默認所屬的域是 .sub1.onmpw.com 。因此,sub2.onmpw.com 不會得到任何的屬于 sub1.onmpw.com 的 cookie 信息。因為它們是在不同的主機上面,并且二者的子域也是不同的。

1.1 設(shè)置二者的 cookie 信息在同一個域下
  • 登錄 sub1.onmpw.com 系統(tǒng)

  • 登錄成功以后,生成唯一標識符Token(知道token,就知道哪個用戶登錄了)。設(shè)置 cookie 信息,這里需要注意,將Token存到 cookie 中,但是在設(shè)置的時候必須將這 cookie 的所屬域設(shè)置為頂級域 .onmpw.com 。這里可以使用 setcookie 函數(shù),該函數(shù)的第四個參數(shù)是用來設(shè)置 cookie 所述域的。

setcookie(‘token’, ’xxx’, '/', ’.onmpw.com’);復(fù)制代碼
  • 訪問 sub2.onmpw.com 系統(tǒng),瀏覽器會將 cookie 中的信息 token 附帶在請求中一塊兒發(fā)送到 sub2.onmpw.com 系統(tǒng)。這時該系統(tǒng)會先檢查 session 是否登錄,如果沒有登錄則驗證 cookie 中的 token 從而實現(xiàn)自動登錄。

  • sub2.onmpw.com 登錄成功以后再寫 session 信息。以后的驗證就用自己的 session 信息驗證就可以了。

1.2 退出登錄

這里存在一個問題就是 sub1 系統(tǒng)退出以后,除了可以清除自身的 session 信息和所屬域為 .onmpw.com 的 cookie 的信息。它并不能清除 sub2 系統(tǒng)的 session 信息。那 sub2 仍然是登錄狀態(tài)。也就是說,這種方式雖說可以實現(xiàn)單點登錄,但是不能實現(xiàn)同時退出。原因是,sub1 和 sub2 雖說通過 setcookie 函數(shù)的設(shè)置可以共享 cookie,但是二者的sessionId 是不同的,而且這個 sessionId 在瀏覽器中也是以 cookie 的形式存儲的,不過它所屬的域并不是 .onmpw.com 。

那如何解決這個問題呢?我們知道,對于這種情況,只要是兩個系統(tǒng)的 sessionId 相同就可以解決這個問題了。也就是說存放 sessionId 的 cookie 所屬的域也是 .onmpw.com 。在PHP中,sessionId 是在 session_start() 調(diào)用以后生成的。要想使sub1 和 sub2 有共同的 sessionId ,那必須在 session_start() 之前設(shè)置 sessionId 所屬域:

ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', '.onmpw.com');
ini_set('session.cookie_lifetime', '0');復(fù)制代碼
  • 1、經(jīng)過上面的步驟就可以實現(xiàn)不同二級域名的單點登錄與退出。

  • 2、不過還可以再簡化,如確保 sessionId 相同就可以實現(xiàn)不同二級域名的單點登錄與退出。

  • 參考文章: https://www.onmpw.com/tm/xwzj/network_145.html

2、不同域之間如何實現(xiàn)單點登錄 - CAS

假設(shè)我們需要在以下這些站之間實現(xiàn)單點登錄

  • www.onmpw1.com

  • www.onmpw2.com

  • www.onmpw3.com

上面的方案就行不通了。

目前 github 上有開源的 SSO 解決方案,實現(xiàn)原理與主流 SSO 差不多:https://github.com/jasny/sso

核心原理:

  • 1、客戶端訪問不同的子系統(tǒng),子系統(tǒng)對應(yīng)的 SSO 用戶服務(wù)中心使用相同的 SessionId

  • 2、子系統(tǒng) Broker 與 Server 間通過 attach 進行了授權(quán)鏈接綁定

同根域名不指定 domain 根域名,第一次授權(quán)需要每次都要跳轉(zhuǎn)到授權(quán)服務(wù),但是指定了domain, 同根域名只要有一個授權(quán)成功,都可以共用那個 cookie 了,下次就不用再授權(quán)了,直接就可以請求用戶信息了。

第一次訪問A:

PHP中實現(xiàn)SSO單點登錄的方法

第二次訪問B:

PHP中實現(xiàn)SSO單點登錄的方法

2.1 登錄狀態(tài)判斷

用戶到認證中心登錄后,用戶和認證中心之間建立起了會話,我們把這個會話稱為全局會話。當用戶后續(xù)訪問系統(tǒng)應(yīng)用時,我們不可能每次應(yīng)用請求都到認證中心去判定是否登錄,這樣效率非常低下,這也是單Web應(yīng)用不需要考慮的。

我們可以在系統(tǒng)應(yīng)用和用戶瀏覽器之間建立起局部會話,局部會話保持了客戶端與該系統(tǒng)應(yīng)用的登錄狀態(tài),局部會話依附于全局會話存在,全局會話消失,局部會話必須消失。

用戶訪問應(yīng)用時,首先判斷局部會話是否存在,如存在,即認為是登錄狀態(tài),無需再到認證中心去判斷。如不存在,就重定向到認證中心判斷全局會話是否存在,如存在,通知該應(yīng)用,該應(yīng)用與客戶端就建立起它們之間局部會話,下次請求該應(yīng)用,就不去認證中心驗證了。

2.2 退出

用戶在一個系統(tǒng)退出了,訪問其它子系統(tǒng),也應(yīng)該是退出狀態(tài)。要想做到這一點,應(yīng)用除結(jié)束本地局部會話外,還應(yīng)該通知認證中心該用戶退出。

認證中心接到退出通知,即可結(jié)束全局會話,用戶訪問其它應(yīng)用時,都顯示已登出狀態(tài)。

需不需要立即通知所有已建立局部會話的子系統(tǒng),將它們的局部會話銷毀,可根據(jù)實際項目來。

感謝各位的閱讀,以上就是“PHP中實現(xiàn)SSO單點登錄的方法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對PHP中實現(xiàn)SSO單點登錄的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI