劉瑋瑋 黃清政
摘 要: 在改進傳統(tǒng)權限系統(tǒng)不足之處的基礎上,研究實現(xiàn)了基于Web Services技術的統(tǒng)一權限系統(tǒng)架構。采用這樣的架構,可以將權限系統(tǒng)封裝成從業(yè)務系統(tǒng)中獨立出來SOA體系服務,為多個不同的業(yè)務系統(tǒng)共享,業(yè)務系統(tǒng)不必再關心權限方面的細節(jié)。相對于其他類似系統(tǒng)主要關注對數(shù)據(jù)的整合,該統(tǒng)一權限系統(tǒng)主要關注功能的整合,目的是改變目前權限管理的模式,讓權限的管理更加全局化,讓維護和升級更加容易。
關鍵詞: Web Services; 統(tǒng)一權限; J2EE; SOA
中圖分類號:TP393.07 文獻標志碼:A 文章編號:1006-8228(2015)05-38-03
Abstract: To improve the traditional authority system, this paper studies and implements a unified authority system architecture based on the technology of Web Services. With this architecture, the authority system can be encapsulated as a SOA service independent from the business system, a number of different business systems can share the authority system without considering the details of authority. Compared with other similar systems mainly focus on data integration, this unified authority system mainly focus on the function integration, intents to change the current authority management mode, and makes the management of authority more global, makes the maintenance and upgrading more easy.
Key words: Web Services; unified authority; J2EE; SOA
0 引言
在任何信息系統(tǒng)中,權限管理都處于核心地位。權限管理既要保障系統(tǒng)的安全,又要方便管理和使用。由于日常信息系統(tǒng)經(jīng)常要修改功能和增加新模塊,這需要和軟件供應商進行溝通,常會因時間或經(jīng)費的原因放棄一些很好的想法,系統(tǒng)也因此更新慢或長時間不更新,不能滿足日益增長的需求。如OA系統(tǒng)、CRM系統(tǒng)、CRU系統(tǒng)、稽核系統(tǒng)等,這些系統(tǒng)中對權限控制方面的要求都非常高,特別是跟管理和財務掛鉤的CRU和CRM系統(tǒng),要花大量精力在權限系統(tǒng)的設計和開發(fā)上。
目前比較流行的權限系統(tǒng)架構大多數(shù)是采用代碼復用和數(shù)據(jù)庫結構復用的方式集成到具體的業(yè)務系統(tǒng)中[1],對于不同架構、不同部署環(huán)境的軟件,在開發(fā)、維護、使用中都可能存在不易維護、不能支持不同平臺和架構、不方便共享數(shù)據(jù)、系統(tǒng)安全性低等問題。如單點登錄系統(tǒng)的應用領域主要是對已存在的多個系統(tǒng)之間的身份認證。主要解決在多個系統(tǒng)之間訪問時不必多次登錄的問題,即自動登錄,并沒有關注整個信息系統(tǒng)中權限的統(tǒng)一管理和子系統(tǒng)權限管理的問題。Portal系統(tǒng)關注的是已存在系統(tǒng)間信息的整合,是通過一種機制,讓用戶能在一個頁面中集成更多系統(tǒng)的信息,并能在各系統(tǒng)之間順利的訪問[2],而不是建立一個更方便操作、易維護、易擴展的權限管理控制框架。
本文采用Web Services技術解決了這些問題,業(yè)務系統(tǒng)只保留權限查詢和讀取系統(tǒng)共用數(shù)據(jù)的功能,實現(xiàn)的系統(tǒng)通過兩個方式向業(yè)務系統(tǒng)提供服務:通過Web Services向子系統(tǒng)提供權限查詢服務;通過Web頁面服務向子系統(tǒng)提供權限管理服務(功能登記、權限授予、權限變更等)。
1 系統(tǒng)的設計
1.1 權限控制的方式
統(tǒng)一權限系統(tǒng)和業(yè)務系統(tǒng)之間是依賴和被依賴的關系。對最終用戶而言,統(tǒng)一權限系統(tǒng)和業(yè)務系統(tǒng)是一個整體,對業(yè)務系統(tǒng)程序開發(fā)員而言,他們只需要在自己的程序中調用統(tǒng)一權限系統(tǒng)客戶端接口即可,并不需要知道統(tǒng)一權限系統(tǒng)是如何實現(xiàn)的。每個業(yè)務系統(tǒng)及其功能操作都必須在“統(tǒng)一權限系統(tǒng)”中注冊,注冊層次分為三級結構:
⑴ 系統(tǒng),所有需要進行權限控制的業(yè)務系統(tǒng)都必須在統(tǒng)一權限中注冊,并獲得惟一的業(yè)務系統(tǒng)序號,本文稱之為SystemID。SystemID是兩位數(shù)字,其可取值范圍規(guī)定為10-99。
⑵ 模塊,業(yè)務系統(tǒng)中的所有模塊都要在統(tǒng)一權限系統(tǒng)中對應的系統(tǒng)下注冊,并獲得惟一的模塊序號,本文稱之為ModuleID。模塊是屬于某個系統(tǒng)的。模塊序號是五位數(shù)字,由兩位業(yè)務系統(tǒng)序號和三位模塊流水號組成:ModuleID=SystemID+三位流水號。
⑶ 操作,業(yè)務系統(tǒng)中的所有操作都要在統(tǒng)一權限系統(tǒng)中對應的模塊下注冊,并獲得惟一的操作序號,本文稱之為OprationID。操作是屬于某個模塊的,操作是最終節(jié)點(即樹的葉子節(jié)點)。操作由語義表示其具體的功能,如“增加公告”,“修改公告”等,操作序號是八位數(shù)字,由五位模塊流水號和三位流水號組成,如下:OprationID=ModuleID+三位流水號。
為使權限的維護和使用更加方便,統(tǒng)一權限系統(tǒng)中保留了一些基本權限,如瀏覽、增加、刪除、修改、授權、統(tǒng)計等,基本權限的語義是不會改變的,作為系統(tǒng)的默認數(shù)據(jù)存儲在數(shù)據(jù)庫中。每個基本權限都有一個“基本權限代碼”, 本文稱之為BaseRightCode,比如“增加”的基本權限代碼是“A”,“刪除”的基本權限代碼是“D”等等。
1.2 基于角色的權限管理
基于角色的訪問控制方法的思想是把對用戶的授權分成兩部份,用角色來充當用戶行駛權限的中介,用戶與角色之間,以及角色與權限之間就形成了兩個多對多的關系,權限配置工作是組織角色權限的工作步驟之一,只有角色具有相應的權限后,用戶委派才能具有實際意義[3]。系統(tǒng)提供角色定義工具允許用戶根據(jù)自己的需要(職權、職位以及分擔的權利和責任)定義相應的角色。角色之間有相應的繼承關系,當一個角色r1繼承另一個角色r2時,r1就自動擁有了r2的訪問權限(表示r1->r2)[4],角色繼承關系提供了對已有角色的擴充和分類的手段,使定義新的角色可以在已有角色的基礎上進行,擴充就是通過增加父角色的權限去定義子角色,而分類通過不同子角色繼承同一父角色來體現(xiàn)。另外還允許多繼承,即一個角色繼承多個父角色,多繼承體現(xiàn)對角色的綜合能力。
系統(tǒng)采用口令來鑒別用戶身份以達到安全保護的目的。用戶的系統(tǒng)訪問可以用訪問規(guī)則表示,根據(jù)安全策略用訪問規(guī)則給用戶授權,一條訪問規(guī)則可以寫成四元組的形式(u,o,t,p),可用已有權限表示形式重新表示為(u,P)。訪問控制就是要處理怎樣表達和核對訪問規(guī)則的問題,系統(tǒng)的訪問控制分為模塊級控制和界面元素級控制[5]。
1.3 系統(tǒng)權限認證流程
用戶通過統(tǒng)一權限系統(tǒng)提供的單一入口登錄,獲得用戶瘦令牌。當用戶訪問業(yè)務系統(tǒng)時,業(yè)務系統(tǒng)首先判斷用戶的瘦令牌中是否有相關的權限數(shù)據(jù),如果有,則直接取出,如果沒有,則訪問統(tǒng)一權限系統(tǒng)獲取權限數(shù)據(jù),服務器在響應時,按“被請求一次,優(yōu)先級就加一”的策略來改變該權限數(shù)據(jù)的優(yōu)先級別,然后驗證權限數(shù)據(jù)來決定是否執(zhí)行操作??梢杂靡粋€三元組表示一個權限數(shù)據(jù),如下:權限數(shù)據(jù)AuthorityData=(操作Operation,范圍Range,期限Time),簡寫為:AD=(O,Range,T)。
對于一個角色所擁有的所有權限,可以表示為:
角色擁有的權限Role AuthorityData=(角色Role,權限數(shù)據(jù)AD[i])
簡寫為RAD=(Role,AD[j]),其中j為大于等于0的整數(shù)
對于一個用戶所擁有的所有權限,可以表示為:
用戶擁有的權限User AuthorityData=(角色Role[i],權限數(shù)據(jù)[i])
簡寫為UAD=(Role[i],AD[i][j]),其中i和j為大于等于0的整數(shù)
2 系統(tǒng)實現(xiàn)的關鍵技術
2.1 Web Services關鍵技術
XML Web Service是利用XML規(guī)范作為數(shù)據(jù)的標準格式,利用Web的HTTP端口作為網(wǎng)絡信息傳遞的端口而制作的一種遠程的處理服務程序。使用Web Service時在服務端制作信息處理服務程序,在客戶端(數(shù)據(jù)接收端)制作SOAP代理程序,負責實際Web Service的調用以及數(shù)據(jù)轉換[6]。WSDL (Web Services Description Language)規(guī)范是一個描述接口、語義以及Web服務為了響應請求需要經(jīng)常處理的工作的XML文檔,這將使簡單的服務可以方便、快速地被描述和記錄。
SOAP(Simple Object Access Protocol)代理程序提供客戶端其他程序的調用,代理調用程序向Web Service發(fā)出數(shù)據(jù)處理請求,將Web Service傳回的XML數(shù)據(jù)轉換為調用程序規(guī)定的數(shù)據(jù)格式[7]。當商業(yè)用戶通過UDDI找到WSDL描述文檔后,可以通過 SOAP 調用所建立的Web服務中的一個或多個操作。
2.2 采用Apache Axis序列化和反序列化器
Axis是Apache組織推出的SOAP引擎,Axis項目是Apache組織著名的SOAP項目的后繼項目。Axis為開發(fā)者提供了大量的序列化/反序列化器,能夠滿足大部分應用。
序列化/反序列化器在英文中的對應翻譯是Serializer/Deserializer,一個序列化器的功能是遵循一定的映射規(guī)則和編碼風格,將一種類型的JAVA對象通過某種特定的機制,轉換成為XML描述的形式[8];反序列化器的功能是序列化器所做工作的逆操作,兩者相輔相成,成對出現(xiàn)。Axis中的序列化/反序列化器采用設計范式中的工廠模式,每一個Serializer惟一對應一個SerializerFactory;每一個Deserializer惟一對應一個DeserializerFactory。一種類型的JAVA對象具體要采用哪個序列化/反序列化器需要在提供Web服務的服務器和調用Web服務的客戶端分別配置。本文就是采用Axis提供的序列化/反序列化器將對象轉換成XML描述的形式,在統(tǒng)一權限系統(tǒng)和業(yè)務系統(tǒng)之間傳輸。
2.3 Web+EJB組成真正的多層結構
對于統(tǒng)一權限系統(tǒng)來說,事務機制是非常必要的。如果沒有事務完整性支持,系統(tǒng)在用戶訪問量變大時,就有可能發(fā)生各種不可能發(fā)生的邏輯錯誤。由于EJB容器對CMP實現(xiàn)有事務機制的緩存優(yōu)化,因此CMP特別適合多個用戶同時更新同一個數(shù)據(jù)源的情況,CMP這種嚴格的事務完整性保證多個用戶同時操作一個數(shù)據(jù)記錄時,能夠保證性能優(yōu)化和數(shù)據(jù)的完整性。EJB容器不但在單機中提供了對象池和緩存,而且可以跨服務器實現(xiàn)動態(tài)負載平衡,這些都無需開發(fā)者自己編寫任何軟件代碼。
3 系統(tǒng)的發(fā)布與優(yōu)化
很多IDE工具提供了非常方便的方法(如JBuilderX的Web Services Designer),可以圖形化的將Java類或SessionBean中的方法發(fā)布成Web Services服務,當然也可以自己手工創(chuàng)建部署描述符來部署服務[9]。對于復雜的公用數(shù)據(jù),如組織結構樹、數(shù)據(jù)集等,可以通過Map、Collection等復雜的對象傳遞給業(yè)務系統(tǒng),在RPC調用時,Web Services服務器端通過序列化器將Java對象序列化成XML字串,然后加入到SOAP消息中,客戶端在得到結果后也通過序列化器把XML字串反序列化成一個Java對象。
將客戶端程序訪問Web Services所需要的基本參數(shù)放在配置文件里,業(yè)務系統(tǒng)只要修改其中的三個參數(shù),即可完成與統(tǒng)一權限系統(tǒng)之間的連接。不管“統(tǒng)一權限系統(tǒng)”與業(yè)務系統(tǒng)是否在同一臺服務器上,部署都是非常簡單的。
目錄名稱-->
<!—WSDL Server URL Root-->
采用統(tǒng)一權限系統(tǒng)后,獨立性增強了,和業(yè)務系統(tǒng)的耦合度也降低了,但業(yè)務系統(tǒng)需要頻繁地通過Web Services請求數(shù)據(jù),這就對系統(tǒng)的性能提出了更高的要求。本文采取以下幾個措施來提高性能。
措施之一,對角色增加類別字段,不同類型的角色擁有不同的屬性,如權限的繼承性,與用戶的對應關系等,以適合不同子系統(tǒng)的需求。
措施之二,更加靈活的設置操作的作用范圍,因為作用范圍可以是任何一個或多個角色,而角色又是具有層級關系的樹型結構,如果一個一個地選擇樹中的節(jié)點,是非常費時費力的,為達到最大的靈活度,在設置功能的作用范圍時,在選定某個節(jié)點的同時,還要選擇相對于樹的方向,例如僅節(jié)點自己本身、自己及全部子節(jié)點、僅全部子節(jié)點(不包括自己)等,另外還要選擇是“包含”還是“去除”這些節(jié)點。
措施之三,業(yè)務系統(tǒng)通過客戶端訪問統(tǒng)一權限系統(tǒng),本文設計了用戶權限對象UAD,如圖1所示,用于在服務器和客戶端之間傳輸用戶權限數(shù)據(jù)。用戶權限存放在Map中,其鍵為角色的ID,值為該角色所擁有的權限數(shù)據(jù)數(shù)組。
4 結束語
本文采用Web Services技術構建了“統(tǒng)一權限系統(tǒng)”,分析了所帶來的新問題,并提出了相應的解決方法,使權限的統(tǒng)一管理變?yōu)楝F(xiàn)實。采用這樣的架構,可以幫助團隊理清思路,節(jié)省開發(fā)和維護成本。
目前該系統(tǒng)已經(jīng)成功開發(fā),并作為核心模塊應用在第一證券有限公司綜合信息系統(tǒng)中,同時為不同架構(B/S和C/S)和不同部署平臺(Window和Linux)的業(yè)務系統(tǒng)提供服務,取得了不錯的效果。這對于大型企業(yè)、金融機構,或開發(fā)自己產(chǎn)品的IT公司來說,都是很有應用價值的。
參考文獻:
[1] 楊艷國,成立權,劉陽.統(tǒng)一用戶權限管理系統(tǒng)的應用研究[J].計算機光盤軟件與應用,2012.2:59-60
[2] 汪迅寶.用Portlet技術實現(xiàn)數(shù)字化校園信息門戶設計研究[J].電腦知識與技術,2013.9(2):448-450
[3]權限系統(tǒng)概要(收集,整理)[EB/OL].http://www.jdon.com/7309.
[4]關于用戶角色權限管理一點想法[EB/OL].http://www.jdon.com/2897.
[5] 張友生.系統(tǒng)分析與設計技術[M].清華大學出版社,2005.
[6] 饒元.Web Services:分布式網(wǎng)絡體系新架構[J].計算機工程,2004.30(22):1-3
[7] W3C Recommendation. SOAP Version 1.2 Part 1: Messaging Framework(SecondEdition)[EB/OL].(2007-04-27)http://www.w3.org/TR/soap12-part1/.
[8] Apache Software Foundation. Version:1.6.2: Axis2 Architecture Guide [EB/OL].(2012-04-17)http://ws.apache.org/axis2/0_94/
Axis2ArchitectureGuide.html/.
[9] (美)阿姆斯特朗著,詹文軍譯.Java Web Services教程[M].電子工業(yè)出版社,2003.