PHP单点登录
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
之前回答過同樣的問題,我重新拿出來再回答一遍。題主請看
首先提醒一下題主不要被新技術(shù)嚇到了,也不要去查什么SSO(Single Sign On,單點(diǎn)登錄),那樣只能增大你問題的復(fù)雜度和對這個問題的恐懼心理,其實(shí)真的沒那么難。
我來幫你拆解下問題,你說的Session多端登錄,其實(shí)可以拆解為Session共享+登錄,不是什么高級的東西,無非是需要的Session值在讓不同服務(wù)器不同域名的情況下都可以訪問,讓大家都讀取同一個Session值,重要的是同一個session_id()值。這樣的話,每臺(服務(wù)器/項(xiàng)目)讀取的都是同樣的數(shù)據(jù),既然都是讀取同樣的數(shù)據(jù)(尤其讀取同樣的session_id()值),那么我們不就可以憑借此標(biāo)識符讓不同用戶顯示不同的內(nèi)容,多點(diǎn)登陸的問題不就解決了
(把問題簡化,登錄對于用戶看來是一個特別的過程,在我們開發(fā)者看來無非就是讓不同的人讀取到不同的數(shù)據(jù)而已,而我們只需要獲取那個登陸標(biāo)識符即可)。
也就是說,session共享的關(guān)鍵技術(shù)點(diǎn)在于兩點(diǎn):
1. 讓客戶端訪問同一個sessionId,
2. 讓所有域名對應(yīng)的服務(wù)器訪問的Session的數(shù)據(jù)的位置必須一致
下面重點(diǎn)講講實(shí)現(xiàn),Session共享相對于Cookie共享來說較為復(fù)雜,因?yàn)榍闆r相對于比較多,大概有四種情況
同服務(wù)器同域名,同服務(wù)器不同域名,不同服務(wù)器同域名,不同服務(wù)器不同域名。
同服務(wù)器同域名(不同子域名)的實(shí)現(xiàn):
實(shí)現(xiàn)比較簡單,直接找一份網(wǎng)上的demo(圖侵刪),直接按照以下的代碼實(shí)現(xiàn)即可。
同服務(wù)器不同域名的實(shí)現(xiàn):
這種情況下,我們再次明確實(shí)現(xiàn)session共享的關(guān)鍵技術(shù)點(diǎn),同一個sessionId,同樣的數(shù)據(jù)源。
不同域名的話就要先將cookie('PHPSESSID')跨域,然后通過這個sessionid值從MySQL數(shù)據(jù)庫或者Nosql中取得對應(yīng)數(shù)據(jù),這樣就實(shí)現(xiàn)了同服務(wù)器不同域名的session共享。
首先是cookie跨域:
然后是Redis數(shù)據(jù)共享,key就是session_id,值就是需要共享的數(shù)據(jù),使用到的就是Redis的集群技術(shù),實(shí)例過于復(fù)雜,感興趣的可以直接去文章查看:redis cluster 集群 安裝 配置 詳解
不同服務(wù)器同域名的實(shí)現(xiàn):
此種情況與<同服務(wù)器不同域名的實(shí)現(xiàn)>差不多,但在此種情況下不需要考慮cookie跨域的問題了,那么著重實(shí)現(xiàn)數(shù)據(jù)共享即可,同上,key為sessio_id,值為具體的數(shù)據(jù)值,參考文章同上redis cluster 集群 安裝 配置 詳解。
不同服務(wù)器名不同域名的實(shí)現(xiàn):
此種情況和<同服務(wù)器不同域名的實(shí)現(xiàn)>圖探訪,也是要實(shí)現(xiàn)兩個目標(biāo),同一個sessionId,同樣的數(shù)據(jù)源。不同域名的話就要先將cookie('PHPSESSID')跨域,然后通過這個sessionid值從MySQL數(shù)據(jù)庫或者Nosql中取得對應(yīng)數(shù)據(jù),這樣就實(shí)現(xiàn)了同服務(wù)器不同域名的session共享。
首先是cookie跨域:
然后是Redis數(shù)據(jù)共享,key就是session_id,值就是需要共享的數(shù)據(jù),使用到的就是Redis的集群技術(shù),實(shí)例過于復(fù)雜,感興趣的可以直接去文章查看:redis cluster 集群 安裝 配置 詳解。
我們發(fā)現(xiàn)四種情況下的解決方式都差不多,第2種情況<同服務(wù)器不同域名的實(shí)現(xiàn)>和第四種情況<不同域名不同服務(wù)器的實(shí)現(xiàn)>更是基本一樣,其中的核心思想無非就是解決兩個根源問題,session_id大家需要獲取同一個,有一個共享的數(shù)據(jù)源需要給大家獲取。
搞明白了這兩點(diǎn),Session共享的SSO也就水到渠成了。有疑惑可直接在評論區(qū)詢問,我會立即回答。
轉(zhuǎn)載于:https://my.oschina.net/yonghan/blog/791192
總結(jié)
- 上一篇: JVM基础(6)-常用参数总结
- 下一篇: PHP----------安装包lnmp