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