梅本祥



摘 要:文章對現有單點登錄模型作出了優缺點分析,設計了一種基于SOA架構的單點登錄系統。系統基于SOA架構使用Dubbo作為分布式服務框架,Zookeeper作為注冊中心。系統將自定義生成的用戶登錄憑證(Ticket)保存到Redis緩存數據庫和瀏覽器的Cookie中。登錄校驗時,攔截器會將瀏覽器中Cookie的值與Redis中的數據進行比對,以達到校驗效果。本系統充分吸收了現有模型的優點,不僅具有很好的靈活性和易于管理用戶數據的優勢,而且維護簡單,更重要的是它非常適用于高并發高可用需求的應用場景。關鍵詞:單點登錄;SOA; Redis;Cookie
隨著信息化的不斷發展,普通的一體化架構已經無法滿足大型互聯網應用龐大規模的需求,分布式垂直架構逐漸成為大中型網站的主流選擇。然而,在垂直架構中一個系統會被拆分成多個子系統,分別提供不同的服務。例如淘寶,京東這種大型網上商城,會被拆分成相當多的子系統,用戶的一次購物操作就會涉及很多個子系統,若是所有子系統都需要用戶來一次登錄操作,這樣不僅繁瑣而且會增加系統的負擔。在這樣的背景需求下單點登錄系統的出現顯得尤為重要。單點登錄(Single Sign-on,SSO),是指在一個應用系統群中,客戶端只要登錄一個系統就能夠在其他應用系統也得到認汪授權,無需再次登錄[1-2]。
而且在現今環境下,日益增多的需求比如爆發式增長的數據、持續提高的負載等等,對應用系統提出了更嚴苛的挑戰。系統的設計不僅要考慮到高并發高可用性的需求,還要從提高可維護性,資源利用最大化(也就是對服務進行差異化支撐)等方面去思考。本文提出的單點登錄系統,采用面向服務架構(Service-Oriented Architecture,SOA),具有優秀的可維護性以及可擴展性,而且易于針對服務差異化分別搭建服務器集群,可以有效地提高網站性能,提升用戶體驗。
1 相關技術
目前主要的單點登錄實現方案以及它們的優缺點分別如下:
基于經紀人的單點登錄方案的主要特點是引進了第三方的服務器作為經紀人[3] (Broker)用來實現認證功能以及管理用戶信息。該方案的主要優點是對用戶數據進行集中管理和維護比較容易;主要缺點是需要修改原有應用服務器的認證模塊。
基于代理的單點登錄方案(Agent-Based SSO)的主要特點是引入了代理程序(Agent)來為不同的應用系統自動完成認證操作[4]。該方案的優點是不用對原有系統進行改動,具有很好的靈活性;缺點是每一個應用系統都要配置相應的代理插件,增加了維護時的難度。
基于代理&經紀人的單點登錄方案的主要特點是綜合吸收了基于代理方案和基于經紀人方案的優點,不僅具有前者的靈活性而且兼備后者集中管理的優勢[5]。 基于網關的單點登錄方案的主要特點是在網絡的入口處設置一個網關,并且將資源保護在受信網段之內[6]。用戶通過網關的認證授權后,才能進行后續的訪問。該方案的優點是,網關的安裝和設置相對方便;缺點是在多個安全網關的情況下,用戶信息很難進行同步保存。
2 基于SOA的單點登錄方案
SOA具有松耦合、位置透明以及可以在異構平臺間復用等好處[7]。它的最主要特點是表現層和服務層的解耦合,相當于將原來的系統從服務層—刀切開分成兩個子系統,再通過接口聯系起來。系統可拆分為Web和Service兩個子系統。Web系統分為表現層和控制層,表現層提供統一的登錄/注冊界面.控制層處理接收到的用戶請求。Service系統負責具體業務的實現,并對外提供業務接口。
2.1注冊流程
用戶填寫完注冊信息后,系統會生成隨機驗證碼并將其保存在Redis緩存中,與此同時還經消息隊列調用阿里大于短信接口[8],將驗證碼發送給用戶。用戶提交接收到的驗證碼,系統將其與保存在Redis中的信息進行對比,若相同則注冊成功。成功后系統將用戶信息保存在數據庫中。具體流程如圖l所示。
2.2登錄流程
用戶登錄校驗時,系統會將接收到的登錄信息與存放在數據庫中的信息進行對比,判斷用戶是否合法。若合法,則生成一個Ticket票據,然后將此票據存入用戶瀏覽器Cookie中,同時還將Ticket和用戶信息以鍵值對的形式存入Redis緩存數據庫。
Ticket是由系統生成的一個字符串,具有唯一性,用作登錄憑證。我們使用MD5加密后的用戶ID作為Ticket。由于Cookie不能被跨域訪問,然而上級域名下的Cookie能夠被下級域名下的網頁獲得。所以我們要將各個子系統的域名統一為二級域名,而且將Ticket存放在頂級域名下的Cookie中。考慮到數據庫的存取操作耗時較大,而且Ticket不需要持久化存儲,所以我們在服務器端將Ticket存放在Redis緩存中,以提高系統性能。具體流程如圖2所示。
2.3認證流程
我們對必須登錄以后才能進行的請求編寫攔截器。攔截器在請求訪問具體的控制器之前進行登錄判斷:
(l)判斷請求頭部的Cookie中是否存在Ticket。如果不存在Ticket則說明沒有登錄,則重新定向跳轉到登錄頁面。
(2)如果存在Ticket,然后判斷Ticket對應的用戶信息數據是否也存在于Redis緩存中。如果存在用戶信息則說明已經登錄并且沒有過期,那么放行;如果不存在用戶信息那么說明用戶的登錄已經過期,重新定向跳轉到登錄頁面。
由于其他子系統和單點登錄系統在不同的二級域名下,所以當其他子系統向單點登錄系統請求獲取用戶信息時,屬于跨域請求。而在同源策略[9]下,跨域請求可以正常發送,但是得不到返回值。資料格式的使用模式(JSONwith Padding,JSONP)[lo]構建于JSON之上,通過動態生成script標簽加載另一個源上的JS文件來得到返回的JSON數據,我們使用JSONP實現跨域請求。
2.4退出流程
退出時,我們只需將Redis里的Ticket有效時間設置為立即失效即可。
3實驗結果分析
登錄前頁iURL地址為“www.taotao.com”,導航欄顯示“您好,歡迎來到淘淘![登錄][免費注冊]”,如圖3所示。
注冊頁面URL地址為“sso.taotao.com/register”,我們注冊一個用戶名為“小小陽光”的用戶,如圖4所示。
登錄后頁面URL地址為“www.taotao.com”,導航欄顯示為“小小陽光,歡迎來到淘淘![退出]”。說明登錄成功,而且跨域從登錄系統拿到了用戶信息,如圖5所示。
4結語
本文設計實現了一個面向網上商城的單點登錄系統,適用于大中型網站建設。本系統將Ticket票據和用戶信息作為鍵值對放入Redis高速緩存,可提升系統應對高并發訪問時的響應速度。同時系統采取將Ticket保存在Cookie中并使用JSONP技術,解決了跨域訪問的問題。如何控制不同用戶對相關資源的訪問權限是本文還有沒完成的,用戶的權限管理是下一步的主要工作內容。
[參考文獻]
[1]淡艷,尹歉.單點登錄系統模型分析[J].成都大學學報,2008 (2):123-126.
[2]許方恒,陳暄,龍丹.新型的多分布式用戶單點登錄模型[J]計算機應用研究,2012 (9):3355-3357
[3]胡雅琴.分布式跨域單點瑩錄模型的研究與應用[D].上海:上海交通大學,2014
[4]文德民.基于Cookie的跨域單點登錄系統的設計與實現『D].北京:北京郵電大學,2010
[5]林滿山,郭荷清.單點登錄技術現狀及發展[J]計算機應用,2004 (6):248-250
[6]張經宇.門戶系統中單點登錄模型的研究和實現[J]職大學報,2009 (2):98-100
[7lDRIK K, KARL B. DIRK S.Enterprise SOA: service-oriented architecture best practices[M] .US: Prentice Hall PTR. 2004
[8]阿里云.云通信幫助支持[EB/OL].( 2017-12-15) [2018-02-11] .https://doc.alidayu.com/doc2/index.htm
[9]何良,方勇.瀏覽器跨域通信安全技術研究[J]信息安全與通信保密,2013 (4):59-61
[10]黨壽江,王勁林,曾學文,等.JSONP研究及其在IPTV門戶系統中的應用[J]微計算機信息,2010 (30):183-185