季開偉,樂紅兵
(江南大學物聯(lián)網工程學院,江蘇 無錫 214122)
訪問控制[1]是通過具體途徑來限制或準許主體對客體訪問能力及范圍的一種方法,自主訪問控制(DAC)和強制訪問控制[2](MAC)等傳統(tǒng)訪問控制由于使用相對局限,已無法滿是應用系統(tǒng)對于安全性的需求;基于角色的訪問控制[3](RBAC)的研究使訪問控制進入了完全不同的授權模式,RBAC[4]中權限與角色相關聯(lián),用戶權限的集合就是其擁有的角色集合;使用控制(UCON)[5]被譽為下一代的訪問控制模型,定義了授權、義務和條件3 種決定因素,同時提出連續(xù)性和可變性2 種重要特征,但該模型高度抽象且沒有統(tǒng)一管理模型,因而難于直接應用[6]。訪問控制的核心在于控制策略,策略的判定在于訪問請求信息是否滿足控制策略的要求,本文將規(guī)則引擎技術應用到訪問控制中[7],利用規(guī)則描述訪問控制策略,規(guī)則的條件部分是控制策略要求,規(guī)則的動作部分則是訪問控制的授權結果。然后通過對Rete 規(guī)則匹配算法研究,發(fā)現(xiàn)其并不適用于訪問控制環(huán)境,Rete 算法通過保留匹配模式和中間結果來加快匹配速度,更適合多模式多數據的匹配處理。而在訪問控制系統(tǒng)中,數據模式沒有那么復雜,要處理的數據量也相對較小。所以,本文的規(guī)則匹配并沒有采用Rete 算法,而是在Rete 算法研究的基礎上,提出了基于多規(guī)則節(jié)點共享的規(guī)則匹配算法,規(guī)則的條件部分是由一個或多個子條件組合而成,將子條件看作一個節(jié)點,由于規(guī)則間具有相同的子條件,所以多規(guī)則可以共享這個節(jié)點,通過對單個節(jié)點的計算對多個規(guī)則進行處理,從而提高規(guī)則的匹配效率。同時Java 反射機制[8]可以動態(tài)獲取類信息和動態(tài)調用對象方法,滿足了規(guī)則引擎系統(tǒng)動態(tài)性的需求,也彌補了傳統(tǒng)規(guī)則引擎實時性方面的不足,所以本文基于Java 反射技術設計實現(xiàn)了規(guī)則引擎系統(tǒng)。
規(guī)則引擎是由基于規(guī)則的專家系統(tǒng)發(fā)展而來,通過接受數據輸入,解析業(yè)務規(guī)則,并根據業(yè)務規(guī)則做出相應決策[9]。規(guī)則引擎的引入將業(yè)務規(guī)則從業(yè)務邏輯組件中剝離,具體業(yè)務用規(guī)則來表示,業(yè)務要求的變更無需對邏輯組件進行重新設計,只需對規(guī)則進行相應修改,這樣不僅減少了系統(tǒng)開發(fā)成本,而且方便業(yè)務規(guī)則管理和系統(tǒng)維護。
圖1 規(guī)則引擎的工作機制
如圖1 所示,規(guī)則引擎簡單來說有2 個輸入(事實的輸入和規(guī)則的輸入),一個輸出(匹配結果的輸出)[10],規(guī)則引擎的簡要工作流程如下:
1)把事實數據(Fact)輸入到工作內存(Working Memory)中;
2)將靜態(tài)規(guī)則庫中的規(guī)則(Rule)與工作內存中的數據(Fact)進行模式匹配;
3)相匹配的規(guī)則被放入議程(Agenda),如果規(guī)則存在沖突,將沖突的規(guī)則放入沖突集合中;4)解決規(guī)則沖突,然后放入議程(Agenda);5)將規(guī)則執(zhí)行隊列中的規(guī)則逐條執(zhí)行。
為了滿足規(guī)則引擎對于實時性的需求,本文基于Java 反射實現(xiàn)規(guī)則執(zhí)行引擎。Java 反射對任何一個類,都可以獲取類的所有屬性和方法;對任何一個對象,都可以調用其方法;這種動態(tài)獲取類信息和動態(tài)調用對象方法的功能稱為Java 反射機制。因此,反射機制可以幫助創(chuàng)建靈活的代碼,構建靈活的應用,實現(xiàn)動態(tài)的匹配。
規(guī)則引擎模塊設計如圖2 所示。
圖2 規(guī)則引擎模塊設計
1)規(guī)則庫(Rule)用XML 語言定義并存儲業(yè)務規(guī)則,程序設計中,創(chuàng)建LeftHandSide 類封裝規(guī)則的條件部分(LHS),LHS 由一個或多個約束條件組成;創(chuàng)建RightHandSide 類用于封裝規(guī)則的結論部分(RHS),RHS 即滿足所有LHS 約束條件后規(guī)則的執(zhí)行動作;Rule 類則是用于封裝規(guī)則的LHS 和RHS,Rule 類、LeftHandSide 類和RightHandSide 類之間屬于聚合關系。
2)規(guī)則解析(RuleParser)模塊用于對規(guī)則庫中規(guī)則進行解析,該模塊采用Jdom 解析XML 規(guī)則文件[11],將規(guī)則LHS 中所有約束條件和RHS 中所有執(zhí)行動作都用HashMap 形式進行封裝。
3)信息獲取模塊(GetFacts)通過Java 反射獲取當前業(yè)務對象的事實屬性,同樣用HashMap 形式進行封裝。
4)模式匹配器(PatternMatcher)將規(guī)則的約束條件與對象的事實屬性進行匹配,匹配成功的規(guī)則放入matchedRules 中。
5)議程(Agenda)用于管理與當前對象事實匹配的規(guī)則集的執(zhí)行次序。
6)規(guī)則執(zhí)行引擎(ExecutionEngine)是規(guī)則引擎重要的組成部分,通過Java 反射調用執(zhí)行當前對象的方法,即用Method.invoke()方法執(zhí)行匹配規(guī)則RHS 部分要執(zhí)行的動作。
基于屬性的訪問控制[12](ABAC)不是對用戶主體直接授權,而是將主體屬性、資源屬性和環(huán)境屬性作為授權策略的控制基礎。本文根據主體屬性制定訪問控制策略,利用規(guī)則引擎實現(xiàn)了基于屬性的訪問控制。為了方便用戶管理,本文引入角色[13]屬性,角色是權限的載體,將用戶屬性和角色相關聯(lián),當用戶屬性值滿足角色規(guī)定的屬性要求時,對應的角色被激活,用戶獲得該角色所對應的權限。訪問控制模型如圖3 所示。
圖3 訪問控制模型
訪問控制的核心是授權策略,授權策略是用于確定一個主體能否訪問客體的一套規(guī)則,規(guī)則用XML[14]語言來表示,可以動態(tài)建立授權規(guī)則,規(guī)則解析模塊用Jdom 解析XML 規(guī)則文件。規(guī)則的基本結構如下所示:
<rule ></rule >節(jié)點是rule 的根節(jié)點,<rule></rule >中的name 表示規(guī)則名Rule,class 屬性可以判定用戶對象的類型,規(guī)則匹配時可以先過濾與業(yè)務對象相關的規(guī)則。<lhs ></lhs >節(jié)點表示規(guī)則條件部分(condition),即用戶屬性約束;<attribute ></attribute >節(jié)點表示具體的屬性約束條件,可以是一個或多個約束條件;<rhs ></rhs >節(jié)點表示規(guī)則動作部分(action),即授權結果;<rhs ></rhs >中name 是所要反射調用的對象方法名,<prm ></prm>表示方法的參數,即執(zhí)行User 對象setRole()方法分配用戶相應的角色。
Rete 算法是由美國卡內基大學Charles.L.Forgy教授提出的前向鏈接推理算法[15],算法通過保存規(guī)則匹配的歷史結果來加快匹配速度,只對更新的數據進行重新匹配,且通過復用Rete 網絡節(jié)點減少規(guī)則條件的重復判斷,Rete 算法針對多數據多模式,數據變化相對較少的規(guī)則匹配具有很好的性能,但訪問控制環(huán)境中的規(guī)則匹配需要處理的數據相對較少,數據模式也相對簡單,且進行一次匹配即可,所以Rete 算法對于訪問控制中的規(guī)則匹配并不適用。
通過對Rete 算法設計思想和實現(xiàn)方式的研究,盡管Rete 算法不適用于訪問控制系統(tǒng)中的規(guī)則匹配,但也有可借鑒之處,如Rete 算法節(jié)點共享的思想[16],不同的規(guī)則可能擁有相同的Alpha 節(jié)點或Beta 節(jié)點,Rete 算法通過共享這些節(jié)點,從而減少重復的模式匹配,提高匹配效率。
Rete 算法主要通過事實數據在Rete 網絡中流動過濾而實現(xiàn),根節(jié)點(RootNode)是所有的對象進入網絡的入口,對于每個事實,通過類型節(jié)點(ObjectType-Node)的過濾使事實到達正確的AlphaNode,按照此節(jié)點對應的模式對事實進行匹配,如果匹配成功記錄此事實,將事實沿著Rete 網絡到達對應的BetaNode,BetaNode 從左右兩端收到事實進行匹配,如匹配成功就將它們綁定記錄下來,然后將綁定后的事實沿著Rete 網絡到達下一個BetaNode,最后到達合適的TerminalNode。Rete 網絡如圖4 所示。
圖4 節(jié)點共享
現(xiàn)有規(guī)則1 和規(guī)則2,如圖4 所示,規(guī)則1 有C和D1兩個條件,規(guī)則結果為F1;規(guī)則2 有C 和D2兩個條件,規(guī)則結果為F2,即C and D1→F1;C and D2→F2;在構建Rete 網絡時,Alpha 節(jié)點C 作為Beta 節(jié)點E1、E2的左輸入,D1、D2分別是Beta 節(jié)點E1、E2的右輸入,2 個規(guī)則導向不同的Terminal 節(jié)點F1、F2,從圖中可以看出規(guī)則1 和規(guī)則2 共享Alpha 節(jié)點C,Beta節(jié)點不共享,通過節(jié)點共享可以簡化匹配網絡模式,匹配過程中通過復用該節(jié)點減少規(guī)則條件的重復判斷,從而提高規(guī)則的匹配效率。
規(guī)則1 和規(guī)則2 判斷如下:
其中,userType:用戶類型(管理員01,普通用戶02);workArea:工作范圍(部門01,小組02)。
基于多規(guī)則節(jié)點共享規(guī)則匹配算法則首先將規(guī)則的子條件看作一個節(jié)點,如rule1 中有2 個節(jié)點:userType=="01"和manageArea=="01",rule2 中也有2 個節(jié)點:userType=="01"和manageArea=="02",而后將節(jié)點和對應的規(guī)則進行索引,如(userType=="01")→rule1;(manageArea=="01")→rule1;(userType=="01")→rule2;(manageArea=="02")→rule2,并放入索引列表中。然后對規(guī)則中的每個節(jié)點進行計算,如依據對象事實判斷userType=="01"的真假,如果為真,則匹配規(guī)則中下一個節(jié)點;如果為假,則該節(jié)點對應的所有規(guī)則都不匹配,若userType=="01"判斷為假,則該節(jié)點對應的rule1和rule2 兩條規(guī)則都不匹配,將rule1 和rule2 放入刪除集中,這樣當完成rule1 匹配后,就無需對rule2 進行匹配,在這2 個規(guī)則匹配的過程中,將節(jié)點user-Type=="01"作為rule1 和rule2 的共享節(jié)點,多規(guī)則節(jié)點共享的應用加快了規(guī)則的匹配效率,相比按照規(guī)則隊列中的規(guī)則逐條匹配的方式性能優(yōu)勢更加明顯。
圖5 規(guī)則匹配算法流程圖
算法流程描述如下:
1)將規(guī)則的每個節(jié)點P 和P 所對應的每條規(guī)則R 放到索引列表map 中。
2)逐條取出規(guī)則R,判斷其是否在刪除集not-MatchedRules 中,若是則無需對該規(guī)則進行匹配。
3)對于規(guī)則R 的每個節(jié)點P,如果P 未計算,則計算并保存結果。
4)如果P 已計算且結果為真,則匹配下一個節(jié)點P。
5)如果P 已計算且結果為假,則將索引列表map中相關的所有規(guī)則R 刪除,且更新到刪除集not-MatchedRules 中。
6)如果規(guī)則rule 所有節(jié)點都判斷過且為真,則規(guī)則R 匹配成功,將其放入matchedRules。
規(guī)則匹配算法流程如圖5 所示。
算法優(yōu)點:
1)對于訪問控制系統(tǒng)來說,多規(guī)則間有很多相同的子條件,保存子條件的匹配結果則可以不用重復計算,大大減少匹配時間。
2)只要某一子條件為假,則包含該子條件的所有規(guī)則不用匹配則可判定規(guī)則無效,大大減少需要匹配的規(guī)則數。
假設規(guī)則中一共有50 個子條件,隨著相同子條件個數的增加規(guī)則引擎匹配平均時間如表1 所示。
表1 基于對規(guī)則節(jié)點共享匹配算法
圖6 共享子條件個數與匹配時間關系
如圖6 所示,實驗數據表明隨著相同子條件個數的增加,規(guī)則引擎規(guī)則匹配的時間逐漸減少,所以規(guī)則的匹配效率與多規(guī)則中相同子條件的個數有關,相同子條件個數越多,運用多規(guī)則節(jié)點共享的概率就越高,規(guī)則匹配的平均時間就越少,從而規(guī)則引擎的執(zhí)行效率就越高。
當規(guī)則條件部分(LHS)定義的所有約束條件匹配成功時,便將相應的規(guī)則放入議程中,對于議程中的每一條規(guī)則,規(guī)則執(zhí)行引擎將反射調用規(guī)則動作部分(RHS)定義的對象方法setRole()方法,授予該訪問用戶對應的角色,即授予用戶該角色對應的訪問權限。
Drools 是一款為Java 語言定制的開源規(guī)則引擎[17],可以和Java 系統(tǒng)無縫集成,基于Rete 規(guī)則匹配算法,支持熱部署規(guī)則和“人類語言”的規(guī)則編輯,通過使用DSL 可以實現(xiàn)用自然語言來描述業(yè)務規(guī)則,使得業(yè)務分析人員也可以看懂業(yè)務規(guī)則代碼,擁有比較完善的管理系統(tǒng)和開發(fā)環(huán)境。
Drools 與反射驅動的規(guī)則引擎的屬性對比如表2所示。
表2 屬性對比
Drools 與反射驅動規(guī)則引擎對于不同規(guī)則數(個)的平均執(zhí)行時間(ms)對比如表3 所示。
表3 執(zhí)行時間對比 單位:ms
經過比較,Drools 作為一款功能很強大的開源規(guī)則引擎,也有其不足之處,首先,Rete 算法盡管具有很好的性能,但并不適合所有的應用環(huán)境,若事實庫不穩(wěn)定,保存的中間結果也相對不穩(wěn)定,所以用空間換取時間反而是得不償失,不僅占用大量內存,而且算法設計和實現(xiàn)較為復雜,在Drools 規(guī)則引擎中,必須要先建立數據模型,還要對規(guī)則庫中的規(guī)則進行編譯工作,而Java 反射驅動的規(guī)則引擎則相對靈活,無需預先建立數據模型,可以在規(guī)則定義后執(zhí)行規(guī)則,無需進行規(guī)則編譯工作,提高了應用的廣泛性。實驗數據表明,反射驅動規(guī)則引擎的規(guī)則匹配執(zhí)行效率更高。
利用規(guī)則引擎實現(xiàn)基于屬性的授權訪問控制,用規(guī)則描述訪問控制策略,通過增減規(guī)則的約束條件,可以改變控制策略的細化程度,從而滿足控制因素全面性和控制策略靈活性的要求,規(guī)則引擎實現(xiàn)策略與機制分離,則滿足系統(tǒng)通用性的需求,所以規(guī)則引擎的引入將訪問控制提升到了一個全新的局面?;诜瓷錂C制又可以動態(tài)加載和執(zhí)行規(guī)則,增強了訪問控制的動態(tài)性和實時性?;诙嘁?guī)則節(jié)點共享的匹配算法又可以在多規(guī)則中存在相同子條件的情況下提高規(guī)則匹配效率,所以,相比Drools 規(guī)則引擎,反射驅動的規(guī)則引擎更適用于訪問控制系統(tǒng)。
[1]劉宏月,范九倫,馬建峰.訪問控制技術研究進展[J].小型微型計算機系統(tǒng),2004,25(1):56-59.
[2]Sandhu R S.Lattice-based access control models[J].IEEE Computer,1993,26(11):9-19.
[3]Sandhu R S,Coyne E J,F(xiàn)einstein H L,et al.Role-based access control models[J].IEEE Computer,1996,29(2):38-47.
[4]洪帆,何緒斌,徐智勇.基于角色的訪問控制[J].小型微型計算機系統(tǒng),2002,2(2):198-200.
[5]Park J,Sandhu R.Towards usage control models:Beyond traditional access control[C]// Proceedings of the 7th ACM Symposium on Access Control Models and Technologies.2002:57-64.
[6]袁磊.使用控制模型的研究[J].計算機工程,2005,31(12):146-148.
[7]王輝.基于規(guī)則引擎的訪問控制研究[J].計算機安全,2011(6):37-39.
[8]費延偉,劉淑芬,屈志勇,等.Java 反射驅動的規(guī)則引擎技術研究[J].計算機應用,2010,30(5):1324-1326.
[9]王李軍,陶明亮,張曙,等.面向業(yè)務規(guī)則的規(guī)則引擎研究[J].計算機工程,2007,33(24):52-56.
[10]王曉光,楊丹.規(guī)則引擎在分布式環(huán)境下應用的研究[J].計算機應用究,2009,26(5):1825-1827.
[11]李雯,謝輔雯,鄒道明.XML 數據交換技術的應用與研究[J].計算機與現(xiàn)代化,2008(1):91-93.
[12]程相然,陳性元,張斌,等.基于屬性的訪問控制策略模型[J].計算機工程,2010,36(15):131-133.
[13]熊智,徐江艷,王高舉,等.基于角色和規(guī)則引擎的UCON 應用模型[J].計算機工程與設計,2013,34(3):831-836.
[14]傅海英,李暉,王育民.XML 及相關安全研究進展[J].計算機應用研究,2004,21(2):86-88.
[15]Forgy C L,Shepard S J.Rete:A fast match algorithm[J].AI Expert,1987,2(1):34-40.
[16]朱會兵.基于Drools 的信息管理與決策系統(tǒng)的研究與實現(xiàn)[D].武漢:武漢理工大學,2012.
[17]劉偉.Java 規(guī)則引擎-Drools 的介紹及應用[J].微計算機應用,2005,26(6):717-721.