摘要:全稱單點登錄用于實現多系統的登錄認證說白了就是只要一個賬號就可以訪問阿里旗下支付寶淘寶天貓等網站站在企業的角度這樣做有一個好處只要有一個系統負責登錄模塊其他的子系統就可以專注于自己系統的業務邏輯需要的時候請求認證系統就可以站在用戶的角度好處
SSO全稱Single Sign On,單點登錄.用于實現多系統的登錄認證.說白了就是只要一個賬號就可以訪問阿里旗下支付寶,淘寶, 天貓等網站.站在企業的角度這樣做有一個好處:只要有一個系統負責登錄模塊,其他的子系統就可以專注于自己系統的業務邏輯,需要的時候請求認證系統就可以.站在用戶的角度好處在于只要一個賬號就可以訪問其公司旗下所有產品.
SSO有多種實現方案,這次我們來分析一下其中的一種可行方案.并且擼起袖子代碼實現一遍.其實現效果如下
一個賬號可以同時訪問www.a.com跟www.b.com
賬號在一個系統中退出,其他系統也同樣退出.
如果需要,改動一點代碼可以實現賬號在www.a.com登錄之后訪問www.b.com不用進行賬戶密碼登錄認證.
原理在實現之前,我們來分析一下整個流程.
通常情況下,系統判斷用戶是否登錄都是校驗session.在SSO架構中,判斷用戶是否登錄仍然依靠session,但是session由SSO server維護, session_id由client保持,client直接訪問的卻是業務系統.
在這樣的情況下,要想能夠使用session進行登錄驗證. 假設client訪問業務系統,業務系統取得其session_id,然后把session_id提交到SSO Server進行驗證.我們看到這里的業務系統充當了一個proxy的角色,下文以proxy指代各個業務系統.
這種方式簡單粗暴,但是有一個很大的局限性 : client持有的session_id由SSO Server發布的,proxy跟SSO Server必須持有相同域名,不然proxy無法獲取到client的session_id.所以需要在這種思路上做一點改變.
client訪問proxy,proxy隨機生成一個token作為cookie保存,并且SSO Server維護有一個以token為文件名的文件,文件保存了client訪問SSO Server生成的session id.當proxy需要驗證client身份,只要獲取到token,到SSO Server訪問token文件,獲取到session id.那么久可以訪問到session數據.從而判斷該client是否已經登錄.
總體設計思路如上,但是除了token,為了保證安全性,以及多個proxy之間不會產生沖突.一個完整的流程應該如下 :
client ---> proxyA.proxyA為client生成一個隨機的token當做cookie.然后引導client重定向到SSO Server.其中引導client重定向到SSO Server應該包含如下信息
token,由proxy生成的隨機值
command 即訪問SSO Server的目的,一般為SSO Server系統中的一個函數名.
returnUrl : 一般為client訪問proxyA的url,即SSO Server 會重新引導client返回當前頁面
當前proxy的ID.proxy跟SSO Server之間約定好的一個唯一ID,并且每個唯一ID必須對應一個secret key.這個key只有當前proxy跟SSO Server知道.
checksum : 一個包含上述信息和secret key的單項加密,用于SSO Server驗證參數是否被惡意修改.
上述的重定向url應該類似www.sso.com?token=xxx&command=xxx&returnurl=xxx&proxy=proxyA&checksum=xxx.client被proxyA重定向到SSO Server之后,SSO校驗參數的合法性后為client生成一個session_id.并且創建一個以proxyID-token-checksum的命名的文件,保存當前client的session id.完成上述操作之后引導client重定向到returnUrl.這樣用戶的體驗不會受到影響.
client重定向到proxyA后可以進行登錄操作,proxyA可以從cookie中獲取到token.client提交用戶名跟密碼,proxyA重新生成一個proxyID-token-checksum的字符串,然后和用戶名密碼一起提交到SSO Server.
SSO Server收到proxyA的請求之后校驗請求的合法性,然后獲取到proxyID-token-checksum文件中的session_id.在驗證用戶密碼之后把登錄信息以proxyID--->username的形式寫到session中.之后返回用戶信息給proxyA.
proxyA受到SSO Server的用戶信息之后,判斷登錄成功.
當用戶在多個proxy上登錄,就會在sesion中維護多個proxyID--->username的鍵值對信息.用戶從一個系統退出,proxy代理client向SSO Server發起退出請求.SSO Server按照上面的步驟獲取到session id.刪除掉所有的session數據.這樣其他proxy的登錄信息也被刪除.下次訪問需重新登錄.
實現上面的流程都清楚了,下面來嘗試用代碼實現
首先必然得有兩個模塊,proxy跟SSO Server.為了能在機子上運行處效果,需要配置虛擬主機,如果想提前看到效果, 可以在這里的SSO目錄下找到全部源碼,在apache下配置好www.a.com, www.b.com以及www.sso.com三個網站,并且在/etc/hosts下配置www.sso.com的ip地址.然后把SSO目錄下的三個子文件夾分別放到對應目錄下.
整個系統中,proxy在三種情況下會請求SSO
attach.主要是為了通過client攜帶token給SSO.并且SSO 分配session_id 給client
login ,登錄.proxy代理 client向SSO發起身份驗證的請求.
logout, 退出登錄,清除SSO維護的session數據.
好了,整個SSO的分析就到這里了,源碼在github可以找到, 而且, 如果懂得上面的認證流程,看懂代碼是很簡單的事情.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22226.html
摘要:概念英文全稱,單點登錄。登錄如上述流程圖一致。系統和系統使用認證登錄。退出上圖,表示的是從某一個系統退出的流程圖。與的關系如果企業有多個管理系統,現由原來的每個系統都有一個登錄,調整為統一登錄認證。 概念 SSO 英文全稱 Single Sign On,單點登錄。 在多個應用系統中,只需要登錄一次,就可以訪問其他相互信任的應用系統。 比如:淘寶網(www.taobao.com),天貓網...
摘要:此時,用戶想要訪問系統受限的資源比如說訂單功能,訂單功能需要登錄后才能訪問,系統發現用戶并沒有登錄,于是重定向到認證中心,并將自己的地址作為參數。前言 只有光頭才能變強。 文本已收錄至我的GitHub倉庫,歡迎Star:github.com/ZhongFuChen… 在我實習之前我就已經在看單點登錄的是什么了,但是實習的時候一直在忙其他的事,所以有幾個網站就一直躺在我的收藏夾里邊: ...
摘要:此時,用戶想要訪問系統受限的資源比如說訂單功能,訂單功能需要登錄后才能訪問,系統發現用戶并沒有登錄,于是重定向到認證中心,并將自己的地址作為參數。前言 只有光頭才能變強。 文本已收錄至我的GitHub倉庫,歡迎Star:github.com/ZhongFuChen… 在我實習之前我就已經在看單點登錄的是什么了,但是實習的時候一直在忙其他的事,所以有幾個網站就一直躺在我的收藏夾里邊: ...
摘要:此時,用戶想要訪問系統受限的資源比如說訂單功能,訂單功能需要登錄后才能訪問,系統發現用戶并沒有登錄,于是重定向到認證中心,并將自己的地址作為參數。前言 只有光頭才能變強。 文本已收錄至我的GitHub倉庫,歡迎Star:github.com/ZhongFuChen… 在我實習之前我就已經在看單點登錄的是什么了,但是實習的時候一直在忙其他的事,所以有幾個網站就一直躺在我的收藏夾里邊: ...
摘要:此時,用戶想要訪問系統受限的資源比如說訂單功能,訂單功能需要登錄后才能訪問,系統發現用戶并沒有登錄,于是重定向到認證中心,并將自己的地址作為參數。 前言 只有光頭才能變強。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 在我實習之前我就已經在看單點登錄的是什么了,但是實習的時候一直在忙其他的事,所以有幾個網站就...
閱讀 1155·2021-10-15 09:39
閱讀 3053·2021-09-10 10:50
閱讀 3455·2019-08-30 15:53
閱讀 1878·2019-08-30 15:52
閱讀 2565·2019-08-29 15:31
閱讀 1978·2019-08-26 13:43
閱讀 2594·2019-08-26 13:37
閱讀 1445·2019-08-23 18:31