張 振,朱志祥,梁小江
(1.西安郵電大學通信技術研究所,陜西西安 710061;2.西安未來國際信息股份有限公司研發(fā)中心,陜西西安 710065)
傳統(tǒng)業(yè)務系統(tǒng)中用戶信息與業(yè)務數(shù)據(jù)存儲在同一數(shù)據(jù)源,若一個用戶同時需要訪問多個業(yè)務系統(tǒng),就需要多次進行登錄認證,而多個業(yè)務系統(tǒng)的登錄認證信息可能會有差異,對于用戶來說,多次登錄認證和多套用戶名密碼是很不不方便而且繁瑣的,同時,對于管理人員來說多個業(yè)務系統(tǒng)之間使用不同的用戶數(shù)據(jù)源,易造成用戶數(shù)據(jù)不同步。
一種經(jīng)過優(yōu)化的用戶管理和認證系統(tǒng),通過將用戶信息從業(yè)務系統(tǒng)分離并整合成統(tǒng)一用戶管理系統(tǒng),做到單一的用戶數(shù)據(jù)源,解決了用戶信息同步的問題[1];通過實現(xiàn)單點認證,用戶只需登錄一次,在同一瀏覽器環(huán)境下,進入其他業(yè)務系統(tǒng)均無需登錄,使得用戶訪問多個系統(tǒng)更加簡單快捷[2]。這種設計提高了管理效率,優(yōu)化了用戶體驗,但是當用戶訪問量很大時,單點認證系統(tǒng)的壓力就會很大。用戶數(shù)據(jù)屬于結構化的數(shù)據(jù),一般都是持久化到關系型數(shù)據(jù)庫中,進行多表關聯(lián),在大量用戶并發(fā)認證并授權時將會出現(xiàn)大量關聯(lián)查詢,數(shù)據(jù)庫承受的讀寫壓力過大[3],這會嚴重影響整個系統(tǒng)的性能。
針對這些問題提出了一套解決方案,該方案使用單一數(shù)據(jù)源保證了用戶數(shù)據(jù)一致性,所有應用服務實現(xiàn)單點認證,并通過應用服務自身對用戶操作進行權限控制,通過分離業(yè)務數(shù)據(jù)與用戶數(shù)據(jù),并對用戶數(shù)據(jù)統(tǒng)一管理,在用戶管理和認證授權部分結合數(shù)據(jù)庫與內(nèi)存數(shù)據(jù)庫各自的優(yōu)點實現(xiàn)用戶數(shù)據(jù)讀寫分離,提升系統(tǒng)的管理和訪問應答性能。
為保證數(shù)據(jù)的一致性,系統(tǒng)采用單一數(shù)據(jù)源整合維護用戶數(shù)據(jù),并實現(xiàn)讀寫分離,應用服務只維護業(yè)務數(shù)據(jù),多個應用服務之間實現(xiàn)單點認證,即一次登錄便可在任何應用間無登錄跳轉。該系統(tǒng)主要包括統(tǒng)一用戶管理系統(tǒng)、用戶數(shù)據(jù)信息、單點認證系統(tǒng)和應用服務4大部分,如圖1所示。其中,用戶數(shù)據(jù)信息部分是本方案的設計重點,將結構化用戶數(shù)據(jù)存儲在數(shù)據(jù)庫中,由統(tǒng)一用戶管理系統(tǒng)進行維護數(shù)據(jù)關系,同時將用戶數(shù)據(jù)重組成JSON格式的數(shù)據(jù),存入內(nèi)存數(shù)據(jù)庫中,利用內(nèi)存數(shù)據(jù)庫讀取快速的特點提高單點認證的負載能力和響應速度[4]。
圖1 系統(tǒng)整體架構
統(tǒng)一用戶管理系統(tǒng),包括系統(tǒng)管理和應用服務管理兩部分。系統(tǒng)管理集中維護所有用戶的基本信息,并對系統(tǒng)本身的用戶角色和權限進行控制管理;應用服務管理并對所有應用服務進行注冊管理,并對各應用的用戶進行角色劃分實現(xiàn)應用的權限管理。角色是應用服務不同模塊權限的集合,決定了用戶對應用服務不同模塊的訪問控制權限[5]。系統(tǒng)設計如圖2所示。
圖2 統(tǒng)一用戶管理系統(tǒng)
用戶數(shù)據(jù)信息主要包括數(shù)據(jù)庫中用戶信息的持久化以及適配用戶信息到內(nèi)存數(shù)據(jù)庫。由于用戶數(shù)據(jù)初始化后改動較少,數(shù)據(jù)寫的壓力并不大,所以統(tǒng)一用戶管理系統(tǒng)直接對數(shù)據(jù)庫進行操作。系統(tǒng)運行過程中伴隨著大量的用戶數(shù)據(jù)讀取,用戶認證需要獲取用戶的驗證信息,認證通過后還需將用戶的基本信息和用戶的權限通過認證系統(tǒng)下發(fā)給業(yè)務系統(tǒng),整個過程中需要對數(shù)據(jù)庫進行多次關聯(lián)查詢,并發(fā)量大時給數(shù)據(jù)庫造成較大壓力,系統(tǒng)整體性能將會降低。認證授權過程中數(shù)據(jù)只有讀取,這樣就可將數(shù)據(jù)結構重組成業(yè)務系統(tǒng)容易獲取,且足夠輕量以便在網(wǎng)絡中傳輸,選擇內(nèi)存數(shù)據(jù)庫來存儲重組后的用戶數(shù)據(jù),在系統(tǒng)開始時將所有用戶信息重組同步到內(nèi)存數(shù)據(jù)中,之后針對個別用戶的修改可進行單個數(shù)據(jù)的同步,這樣在系統(tǒng)運行過程中,利用內(nèi)存數(shù)據(jù)庫讀寫速度快的特點來提高認證授權速度。充分利用數(shù)據(jù)庫和內(nèi)存數(shù)據(jù)庫的特點,實現(xiàn)數(shù)據(jù)的讀寫分離,并提高數(shù)據(jù)使用的靈活性。
數(shù)據(jù)庫中數(shù)據(jù)存儲在數(shù)據(jù)表中,主要數(shù)據(jù)的表為用戶、角色、權限,用戶與角色多對多關聯(lián),角色與權限多對多關聯(lián),這樣通過角色將用戶與權限信息綁定[6],在內(nèi)存數(shù)據(jù)庫中,數(shù)據(jù)保存為鍵值對形式,將用戶名作為鍵值代表一個用戶,將用戶基本信息,角色信息包括權限信息進行數(shù)據(jù)重組,封裝成輕量級的JSON數(shù)據(jù)作為值保存在內(nèi)存數(shù)據(jù)庫中,這樣只通過用戶名就可直接查詢到用戶的所有信息[7],有效減少了數(shù)據(jù)查詢的壓力。由于內(nèi)存數(shù)據(jù)庫將數(shù)據(jù)存儲在內(nèi)存中,數(shù)據(jù)讀取速度很快,系統(tǒng)在用戶認證時能夠快速讀取到數(shù)據(jù)進行響應,如圖3所示。
圖3 用戶數(shù)據(jù)信息適配過程
將用戶數(shù)據(jù)重組并存入內(nèi)存數(shù)據(jù)庫,通過降低數(shù)據(jù)查詢次數(shù)來提高數(shù)據(jù)查詢速度,同時利用內(nèi)存讀取快的特點提高數(shù)據(jù)讀取速度,又因為用戶數(shù)據(jù)重組后更加輕量靈活,也給系統(tǒng)的網(wǎng)絡傳輸和數(shù)據(jù)處理提供了便利。
所有應用服務的認證過程統(tǒng)一由單點認證系統(tǒng)承擔,用戶只需認證一次,就可實現(xiàn)所有應用服務之間無登錄自由跳轉[8]。單點認證系統(tǒng)從內(nèi)存數(shù)據(jù)庫中讀取用戶信息并分發(fā)給用戶正在訪問的應用服務,應用服務獲取到單點認證系統(tǒng)反饋的用戶信息,就可通過用戶權限實現(xiàn)對用戶的訪問控制,因網(wǎng)絡傳輸過程中涉及關鍵信息,故采用Https方式進行數(shù)據(jù)傳輸[9]。單點認證授權過程如圖4所示。
圖4 單點認證授權過程
應用服務是本系統(tǒng)的最終業(yè)務實體,它只維護自身系統(tǒng)的業(yè)務數(shù)據(jù),并不持有或維護用戶數(shù)據(jù),用戶只有在單點認證通過后,用戶當前訪問的應用服務才會獲得用戶數(shù)據(jù),并通過獲取到的用戶數(shù)據(jù)對用戶進行權限控制,不同角色的用戶因為獲得的權限不同,所以在同一個應用服務上可進行的操作是不同的[10]。
(1)統(tǒng)一用戶管理系統(tǒng)?;赟SH(Struts2,Spring,Hibernate)組合框架編程實現(xiàn)。
(2)用戶數(shù)據(jù)信息。采用MySQL+REDIS實現(xiàn),數(shù)據(jù)修改只操作MySQL數(shù)據(jù)庫,REDIS只作為單點認證系統(tǒng)的數(shù)據(jù)源,只進行從MySQL數(shù)據(jù)庫的同步工作。
(3)單點認證系統(tǒng)。采用開源中央認證服務(Central Authentication Service,CAS)實現(xiàn),修改源碼用戶數(shù)據(jù)認證以及屬性返回模塊,使支持讀取內(nèi)存數(shù)據(jù)庫并返回信息。
(4)應用服務權限控制。采用開源Apache shiro集成CAS實現(xiàn),應用服務認證成功后解析CAS分發(fā)的用戶角色和權限信息,實現(xiàn)對用戶的權限控制。
本方案測試重點為用戶數(shù)據(jù)信息部分,同時測試單點認證系統(tǒng)和應用服務信息的權限控制功能能否正常工作。數(shù)據(jù)讀取測試步驟如下:
步驟1 使用MySQL數(shù)據(jù)庫作為統(tǒng)一用戶管理系統(tǒng)的數(shù)據(jù)源,同時作為單點認證系統(tǒng)的認證數(shù)據(jù)源,從數(shù)據(jù)庫讀取100 000條用戶數(shù)據(jù)用時357 s。
步驟2 使用MySQL數(shù)據(jù)庫作為統(tǒng)一用戶管理系統(tǒng)的數(shù)據(jù)源,使用REDIS內(nèi)存數(shù)據(jù)庫作為單點認證系統(tǒng)的認證數(shù)據(jù)源,從數(shù)據(jù)庫讀取100 000條用戶數(shù)據(jù)用時123 s。
單點認證和授權測試使用了兩套不同的內(nèi)容管理系統(tǒng),均需登錄認證后才能進行操作。認證和授權測試步驟如下:
步驟1 使用管理員用戶登錄內(nèi)容管理系統(tǒng)1,登錄后再頁面顯示用戶角色信息。登錄頁面如圖5,登錄成功頁面如圖6所示。
圖5 單點認證系統(tǒng)界面
圖6 內(nèi)容管理系統(tǒng)管理員頁面
步驟2 通過內(nèi)容管理系統(tǒng)1上的鏈接進入內(nèi)容管理系統(tǒng)2,進入頁面如圖7所示。
圖7 內(nèi)容管理系統(tǒng)2管理員頁面
步驟3 退出登錄,使用普通用戶登錄任意一個內(nèi)容管理系統(tǒng),登錄成功頁面如圖8所示。
圖8 內(nèi)容管理系統(tǒng)1普通用戶界面
(1)使用內(nèi)存數(shù)據(jù)庫進行優(yōu)化后,查詢數(shù)據(jù)速度提升了約3倍。
(2)多個應用之間可實現(xiàn)單點認證,能通過返回的JSON數(shù)據(jù)解析到權限信息,并在系統(tǒng)中正確體現(xiàn)。
用戶數(shù)據(jù)實現(xiàn)了統(tǒng)一管理,利用數(shù)據(jù)庫和內(nèi)存數(shù)據(jù)庫的優(yōu)點將數(shù)據(jù)適配存儲,實現(xiàn)用戶數(shù)據(jù)的讀寫分離,既能保證用戶數(shù)據(jù)的關系映射,又能快速響應各應用服務對用戶數(shù)據(jù)的請求。由于應用服務本身不持有和維護用戶信息,實現(xiàn)單點認證同時獲取到授權信息,提高了整個系統(tǒng)的易用性和安全性,使得整個系統(tǒng)性能得到大幅提升。
[1]王茜,史晨昱,李安穎,等.基于統(tǒng)一用戶管理的辦公業(yè)務資源系統(tǒng)集成[J].計算機技術與發(fā)展,2014,1(1):200-203.
[2]張濤,王秉坤.使用 CAS在Tomcat中實現(xiàn)單點登錄[EB/OL].(2008 -4 -10)[2014 -11 -18]http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/.
[3]Russell J T Dyer,李紅軍,李冬梅.MySQL核心技術手冊[M].北京:機械工業(yè)出版社,2009.
[4]陸嘉恒.大數(shù)據(jù)挑戰(zhàn)與NoSQL數(shù)據(jù)庫技術[M].北京:電子工業(yè)出版社,2013.
[5]張琪.基于角色的權限管理系統(tǒng)的設計與實現(xiàn)[D].成都:電子科技大學,2013.
[6]徐斌,袁健.基于Web2.0的用戶權限管理研究與實現(xiàn)[J].計算機工程,2008,34(13):157 -159.
[7]劉國鈞.JavaScript核心概念及實踐[M].北京:人民郵電出版社,2013.
[8]景民昌,唐弟官.開放源碼的CAS單點登錄系統(tǒng)研究[J].現(xiàn)代情報,2009,29(3):125 -127.
[9]趙艷芳.基于CAS的統(tǒng)一認證平臺的設計與實現(xiàn)[J].云南大學學報:自然科學版,2013,35(S2):165 -168.
[10]黃經(jīng)贏.基于Shiro框架的細粒度權限控制系統(tǒng)的設計與實現(xiàn)[J].廣東技術師范學院學報:自然科學,2013(7):20-23.