SSO單點登錄的發展由來以及實現原理
單點登錄以及許可權,在很早之前都有寫過,不過都比較簡單,今天就具體說一下,以及下一步要做的
1、web單系統應用
早期我們開發web應用都是所有的包放在一起打成一個war包放入tomcat容器來運行的,所有的功能,所有的業務,後台管理,門戶界面,都是由這一個war來支持的,這樣的單應用,也稱之為巨石應用,因為十分不好擴展和拆分。
在巨石應用下,用戶的登錄以及許可權就顯得十分簡單,用戶登錄成功後,把相關信息放入會話中,HTTP維護這個會話,再每次用戶請求伺服器的時候來驗證這個會話即可,大致可以用下圖來表示:
如上圖,這個會話就是session,維護了用戶狀態,也就是所謂的HTTP有狀態協議,我們經常可以在瀏覽器中看到JSESSIONID,這個就是用來維持這個關係的key
這樣,每次請求的時候只需要用攔截器來攔截當前用戶的登錄狀態以及授權狀態即可。
如果引入集群的概念,這個單應用可以分別部署在3台tomcat上,使用nginx來實現反向代理, 此時,這個session就無法在這3台tomcat上共享,用戶信息會丟失(這裡不考慮粘性和非粘性的session,我們不推薦做)
2、多應用構建的分散式集群系統
從巨石應用發展至今,我們有SOA,有微服務,其道理都是一樣的,都是進行了業務拆分來分解為多個系統,多個系統完全解耦,可以分別部署在不同的伺服器上,項目之間通過rpc或者restful來實現相互通信,舉個栗子:
http://order.abc.com
http://cart.abc.com
http://service.abc.com
有這麼3個系統,部署在不同的二級域名下,那麼用戶每次登陸不同的系統是不是都要登錄呢?這樣是不合理的,我們不能因為系統的複雜度使得用戶也變得複雜,對於用戶來說,一套產品就是一個完整的應用。登錄一次即可,沒有必要多次登錄。
按照之前所說的session就不適用了,在這個地方我們就引入了單點登錄,保持用戶與服務端之間的無狀態協議,生成token,使用token這個令牌穿梭在各個系統。
那麼這個token放在瀏覽器cookie即可,失效時間需要和redis的expire一致,根據需求我們可以實現用戶登錄一次就可以在任何系統中使用,其次用戶賬戶在別的地方登錄後,上一個用戶則被擠出。
(需要注意的是,這個cookie作為第一方cookie需要對二級域名進行設置,如果要跨域的話需要設置第三方cookie或者使用JWT來做,這個就不多說了)
3、單點登錄SSO(Single Sign On)
對於分散式系統來說,我們需要sso這樣一個用於單點登錄的系統,可以獨立部署在一個web伺服器內,比如域名為 http://login.abc.com,其他所有web服務上的登錄都可以通過這個sso來登錄,app也可以調用登錄
如果,所有的token都由sso來管理,這個token在瀏覽器可以存儲在第一方cookie或者第三方都行,在ios或者安卓上也能夠保持,每次訪問服務的時候放入headers中,讓攔截器進行驗證即可。同時,這個token也可以擴展用來做許可權。
4、手機端的單點登錄
這個不難理解,就像微信那樣,同一個用戶只能在同一個手機端上登錄,這個是用token+緩存就能實現,套用上面所說的攔截器,可以不需要寫很多代碼就能實現。
5、代碼實現以及部署
關於這個我會在這段時間抽空寫個簡單小項目放在github上開源。
推薦閱讀: