1. 程式人生 > >如何設計一個單點登錄系統(1)?

如何設計一個單點登錄系統(1)?

ping 微信 根據 files 示例 o-c 基本 形式 TP

單點登錄系統的由來

隨著互聯網技術的發展,目前各大公司都在瘋狂擴張業務,比如像阿裏巴巴,旗下就有淘寶,天貓,支付寶等業務線,按照目前的互聯網產品,基本上每個產品都會涉及到賬戶體系,不管是社交也好,電商也罷,都省不了需要一套賬號體系,我們在平時的生活過程中其實也經常遇到這樣的問題,比如下載某個APP,就得來一次註冊的流程,雖然目前的註冊流程相對簡單,但是對用戶來講依然比較麻煩,對此第三方登錄便應運而生,比如我們經常會在登錄頁看到類似“微信登錄”,“人人網賬號登錄”,“微博賬號登錄”等登錄入口,其本質也是為了簡化用戶的登錄邏輯,但是由於微信,人人網,微博的賬號也不互通,這種第三方登錄的方式仍然解決不了根本問題,最理想的情況是我們在某一個地方登錄後進任何網站都不需要再登錄,但這終究也只會是個設想,因為每個公司的賬號體系都早已成熟,集成所有公司的賬號體系顯然代價很大,而且企業基於安全問題也不會願意合作,那既然公司與公司間不能互通,公司內的系統直接能否互通呢,比如阿裏系的淘寶和天貓,我們發現其實現在已經做到了互通,我在淘寶上登錄後,再進天貓的時候就不需要再登錄了,還有就是比如企業內部的管理系統,企業內部可能會有wiki,bbs,gitlab,oa等系統,如果每個賬號都需要單獨註冊,單獨登錄,這對於公司每個人來講都是不可接受的,所以單點登錄系統應運而生。

單點登錄的概念

對於很多技術人來講,可能看到“單點”這個字眼就覺得是單點部署,甚至會有高可用的問題,其實不然,此處的“單點”並不是是部署上的“單點”,而是指所有系統的登錄,認證邏輯都挪到同一個系統,而不再是分散到各個系統中。

一個好的單點登錄系統需要做些什麽?

  1. 跨域

這是一個很重要的考核標準,很多單點登錄的實現都不能做到跨域,必須都在同一個父域名下,比如 a.xxx.com,b.xxx.com,c.xxx.com這種域名,如果再有a.yyy.com就做不到了,這樣都話很顯然就有局限性,必須限制服務部署的域名

2.賬號同步

比如我在A系統註銷登錄,那麽進入B系統時也必須是註銷狀態,否則單點登錄的價值就不存在了

3.接入方便

要實現單點登錄,肯定需要開發者介入開發,如果接入流程繁瑣的話,恐怕就會很難推進

本人前段時間基於興趣寫了一個單點登錄的工程,在此先介紹一下此系統

源碼地址:https://github.com/zhoudapeng/zsso

本工程一共分為4個模塊:zsso-client,zsso-client-demo,zsso-common,zsso-server

職責劃分如下:

zsso-client:客戶端相關代碼,以jar包形式存在,客戶端接入時需要依賴此模塊,此模塊集成了跟server端的交互邏輯已經對於zsso命名空間的支持

zsso-server:服務端實現,以war包形式存在,直接部署

zsso-common:公共模塊

zsso-client-demo:客戶端demo,供使用者參考

先介紹下使用方式

  1. 在web.xml中配置過濾器

<filter><filter-name>zssoFilter</filter-name><filter-class>com.zdp.zsso.client.filter.ZssoFilter</filter-class></filter><filter-mapping><filter-name>zssoFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping>

2.在應用層spring配置文件配置自動驅動

<zsso:auto-driven/>

3.配置zsso-client配置文件,配置文件可以分環境配置,分別見src/main/profiles/(dev|beta|product),配置項示例如下:

#系統名,需要在server端備案zsso.system.name=wiki #本地cookie的domain zsso.system.cookie.domain=.wiki.com #server端url前綴 zsso.server.url.prefix=http://www.zsso.com:8080

4.按需拓展相關組件,組件一共包括4個部分,且都有默認實現,接入方可以按需自己實現相關組件:

UrlHelper:拼接url的組件,如無特殊需求不建議重新實現

ZssoClient:跟服務端交互的組件,如無特殊需求不建議重新實現

ZssoConfigResolver:解析配置文件的組件,默認實現是讀取本地classpath下zsso-client.properties配置文件,如無特殊需求不建議重新實現

UserStore:存取用戶信息的組件,包括根據token解析用戶信息,綁定token與userId關系,解綁token,默認實現只是為了演示用,接入方請務必自己實現此接口

5.快速使用:

5.1.為了模擬跨域的情況,先綁定本地host

127.0.0.1 www.zsso.com127.0.0.1 www.wiki.com 127.0.0.1 www.bbs.com

5.2.啟動zsso-server端,使用8080端口

5.3.啟動zsso-client-demo,使用8081端口

5.4.訪問http://www.wiki.com:8081/profile/detail?id=123

5.5.在zsso登錄頁登錄,賬號:zhoudapeng 密碼:12345

由於篇幅原因,具體的設計思路我將在下一篇文章中介紹,敬請期待!

如何設計一個單點登錄系統(1)?