PHP单点登录
2019獨角獸企業重金招聘Python工程師標準>>>
之前回答過同樣的問題,我重新拿出來再回答一遍。題主請看
首先提醒一下題主不要被新技術嚇到了,也不要去查什么SSO(Single Sign On,單點登錄),那樣只能增大你問題的復雜度和對這個問題的恐懼心理,其實真的沒那么難。
我來幫你拆解下問題,你說的Session多端登錄,其實可以拆解為Session共享+登錄,不是什么高級的東西,無非是需要的Session值在讓不同服務器不同域名的情況下都可以訪問,讓大家都讀取同一個Session值,重要的是同一個session_id()值。這樣的話,每臺(服務器/項目)讀取的都是同樣的數據,既然都是讀取同樣的數據(尤其讀取同樣的session_id()值),那么我們不就可以憑借此標識符讓不同用戶顯示不同的內容,多點登陸的問題不就解決了
(把問題簡化,登錄對于用戶看來是一個特別的過程,在我們開發者看來無非就是讓不同的人讀取到不同的數據而已,而我們只需要獲取那個登陸標識符即可)。
也就是說,session共享的關鍵技術點在于兩點:
1. 讓客戶端訪問同一個sessionId,
2. 讓所有域名對應的服務器訪問的Session的數據的位置必須一致
下面重點講講實現,Session共享相對于Cookie共享來說較為復雜,因為情況相對于比較多,大概有四種情況
同服務器同域名,同服務器不同域名,不同服務器同域名,不同服務器不同域名。
同服務器同域名(不同子域名)的實現:
實現比較簡單,直接找一份網上的demo(圖侵刪),直接按照以下的代碼實現即可。
同服務器不同域名的實現:
這種情況下,我們再次明確實現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也就水到渠成了。有疑惑可直接在評論區詢問,我會立即回答。
轉載于:https://my.oschina.net/yonghan/blog/791192
總結
- 上一篇: JVM基础(6)-常用参数总结
- 下一篇: PHP----------安装包lnmp