PHP單點登陸

以前回答過一樣的問題,我從新拿出來再回答一遍。題主請看html

首先提醒一下題主不要被新技術嚇到了,也不要去查什麼SSO(Single Sign On,單點登陸),那樣只能增大你問題的複雜度和對這個問題的恐懼心理,其實真的沒那麼難。redis

我來幫你拆解下問題,你說的Session多端登陸,其實能夠拆解爲Session共享+登陸,不是什麼高級的東西,無非是須要的Session值在讓不一樣服務器不一樣域名的狀況下均可以訪問,讓你們都讀取同一個Session值,重要的是同一個session_id()值。這樣的話,每臺(服務器/項目)讀取的都是一樣的數據,既然都是讀取一樣的數據(尤爲讀取一樣的session_id()值),那麼咱們不就能夠憑藉此標識符讓不一樣用戶顯示不一樣的內容,多點登錄的問題不就解決了sql

(把問題簡化,登陸對於用戶看來是一個特別的過程,在咱們開發者看來無非就是讓不一樣的人讀取到不一樣的數據而已,而咱們只須要獲取那個登錄標識符便可)。數據庫

也就是說,session共享的關鍵技術點在於兩點:跨域

1. 讓客戶端訪問同一個sessionId,
2. 讓全部域名對應的服務器訪問的Session的數據的位置必須一致服務器

下面重點講講實現,Session共享相對於Cookie共享來講較爲複雜,由於狀況相對於比較多,大概有四種狀況cookie

同服務器同域名,同服務器不一樣域名,不一樣服務器同域名,不一樣服務器不一樣域名。session

同服務器同域名(不一樣子域名)的實現:nosql

實現比較簡單,直接找一份網上的demo(圖侵刪),直接按照如下的代碼實現便可。
htm

同服務器不一樣域名的實現:

這種狀況下,咱們再次明確實現session共享的關鍵技術點,同一個sessionId一樣的數據源
不一樣域名的話就要先將cookie('PHPSESSID')跨域,而後經過這個sessionid值從MySQL數據庫或者Nosql中取得對應數據,這樣就實現了同服務器不一樣域名的session共享。
首先是cookie跨域:

而後是Redis數據共享,key就是session_id,值就是須要共享的數據,使用到的就是Redis的集羣技術,實例過於複雜,感興趣的能夠直接去文章查看:redis cluster 集羣 安裝 配置 詳解

不一樣服務器同域名的實現:

此種狀況與<同服務器不一樣域名的實現>差很少,但在此種狀況下不須要考慮cookie跨域的問題了,那麼着重實現數據共享便可,同上,key爲sessio_id,值爲具體的數據值,參考文章同上redis cluster 集羣 安裝 配置 詳解

不一樣服務器名不一樣域名的實現:

此種狀況和<同服務器不一樣域名的實現>圖探訪,也是要實現兩個目標,同一個sessionId一樣的數據源。不一樣域名的話就要先將cookie('PHPSESSID')跨域,而後經過這個sessionid值從MySQL數據庫或者Nosql中取得對應數據,這樣就實現了同服務器不一樣域名的session共享。
首先是cookie跨域:

而後是Redis數據共享,key就是session_id,值就是須要共享的數據,使用到的就是Redis的集羣技術,實例過於複雜,感興趣的能夠直接去文章查看:redis cluster 集羣 安裝 配置 詳解

咱們發現四種狀況下的解決方式都差很少,第2種狀況<同服務器不一樣域名的實現>和第四種狀況<不一樣域名不一樣服務器的實現>更是基本同樣,其中的核心思想無非就是解決兩個根源問題,session_id你們須要獲取同一個,有一個共享的數據源須要給你們獲取。

搞明白了這兩點,Session共享的SSO也就水到渠成了。有疑惑可直接在評論區詢問,我會當即回答。

相關文章
相關標籤/搜索