葉茂林,余發(fā)江
空天信息安全與可信計(jì)算教育部重點(diǎn)實(shí)驗(yàn)室,武漢大學(xué)國家網(wǎng)絡(luò)安全學(xué)院,湖北 武漢 430072
目前的大部分應(yīng)用都將應(yīng)用用戶的身份認(rèn)證信息、權(quán)限信息以及敏感資料都存儲(chǔ)在數(shù)據(jù)庫中。在這種情況下,要實(shí)現(xiàn)對(duì)應(yīng)用的訪問控制,一般可以使用的方法有兩種:一種是使用數(shù)據(jù)庫本身的訪問控制機(jī)制,另一種是在應(yīng)用層實(shí)現(xiàn)訪問控制。使用數(shù)據(jù)庫本身的訪問控制機(jī)制最大的缺陷在于數(shù)據(jù)庫連接池的廣泛使用使得DBMS(database management system)無法確定當(dāng)前應(yīng)用用戶。而在應(yīng)用層實(shí)現(xiàn)控制的方式分為硬編碼和使用安全框架兩種,硬編碼的方式依賴開發(fā)人員的編碼能力,難以保證應(yīng)用的安全性,使用安全框架可以提高安全性,但訪問控制功能的開發(fā)與數(shù)據(jù)庫、業(yè)務(wù)代碼、安全框架都有關(guān)聯(lián),因此仍然存在開發(fā)繁瑣、維護(hù)困難等問題。
Eykholt等[1]開 發(fā) 了SafeD,使 用 幻 影 提 ?。╬hantom extraction)技術(shù)來強(qiáng)制執(zhí)行符合訪問控制策略的SQL語句,避免了使用數(shù)據(jù)庫視圖,使得廣泛存在的視圖更新問題得到解決。SafeD通過擴(kuò)展JDBC的方式實(shí)現(xiàn),文獻(xiàn)[1]在Mysql和PostgreSQL上進(jìn)行了實(shí)驗(yàn),SafeD的效率和可用性良好。Mehta等[2]開發(fā)了一個(gè)既不依賴應(yīng)用程序正確性,也不依賴特定的數(shù)據(jù)庫支持的訪問控制系統(tǒng)Qpala。Qpa?la在數(shù)據(jù)庫適配器中實(shí)現(xiàn)。SafeD和Qpala都是基于傳統(tǒng)的RBAC(role-based access control,基于角色的訪問控制)開發(fā)的,而RBAC無法滿足日益復(fù)雜的應(yīng)用場(chǎng)景需求。并且SafeD和Qpala在數(shù)據(jù)庫與應(yīng)用層的中間層實(shí)現(xiàn),如JDBC驅(qū)動(dòng)。但不同種類的數(shù)據(jù)庫JDBC驅(qū)動(dòng)不同,擴(kuò)展JDBC時(shí)需要對(duì)每個(gè)JDBC驅(qū)動(dòng)進(jìn)行更改。
針對(duì)以上問題,本文提出了一種新的訪問控制解決方案SDBatis。SDBatis以CBAC(contextbased access control,基于上下文的訪問控制)作為訪問控制模型[3,4],同時(shí)解決了應(yīng)用訪問控制方式中開發(fā)繁瑣、維護(hù)困難的問題。相對(duì)于以往的工作,SDBatis對(duì)復(fù)雜的應(yīng)用場(chǎng)景和不同的數(shù)據(jù)庫具有更強(qiáng)的適應(yīng)性。
應(yīng)用的訪問控制可以利用數(shù)據(jù)庫自身的訪問控制系統(tǒng)來實(shí)現(xiàn),目前流行的數(shù)據(jù)庫普遍支持創(chuàng)建和管理數(shù)據(jù)庫用戶,My SQL 8.0和Oracle還支持定義數(shù)據(jù)庫角色[5],使用這兩個(gè)功能可以完成表、列、視圖、存儲(chǔ)過程級(jí)別的訪問控制[6]。使用角色進(jìn)行訪問控制的示例為:
GRANT SELECT(emp_id)ON employee TO manager
上述示例的含義是將查詢employee表中emp_id列的權(quán)限賦予manager。本文給出的示例使用了一個(gè)虛擬的企業(yè)數(shù)據(jù)庫,其中包括兩張表,分別 為 職 員 表:employee(emp_id,name,gender,dept),職 員 工 資 表:emp_salary(emp_id,salary)。職員表包含職員的基本信息,職員工資表包含職員id和職員工資信息。
使用數(shù)據(jù)庫訪問控制機(jī)制的優(yōu)勢(shì)在于可以進(jìn)行細(xì)粒度的訪問控制(fine grained access control,F(xiàn)GAC),常見的方式為使用視圖控制權(quán)限。如圖1所示,CREATE VIEW語句表示創(chuàng)造一個(gè)包含職員名稱和工資的視圖;GRANT語句表示如果將查詢?cè)撘晥D的權(quán)限賦予manager角色,則manager角色只能查詢測(cè)試部門職員的名稱與工資信息。但是使用視圖的方式會(huì)面臨一個(gè)新問題:視圖更新問題[7,8]。一些數(shù)據(jù)庫開發(fā)商為了細(xì)粒度訪問控制開發(fā)了自己的系統(tǒng),如Oracle 11g中實(shí)現(xiàn)的VPD(vir?tual private database,虛擬專用數(shù)據(jù)庫)機(jī)制。VPD可以支持細(xì)粒度的訪問控制[9,10],它通過當(dāng)前數(shù)據(jù)庫用戶的“應(yīng)用上下文”和VPD策略重寫用戶的SQL語句,以強(qiáng)制執(zhí)行行級(jí)或列級(jí)安全性要求[11,12]。
圖1 使用視圖控制權(quán)限Fig.1 Use view control permissions
以上的訪問控制方式都需要以連接數(shù)據(jù)庫的用戶作為目標(biāo)或條件,但目前普遍采用數(shù)據(jù)庫連接池來解決資源問題[13,14]。在使用連接池的情況下,開發(fā)者會(huì)配置權(quán)限較大的數(shù)據(jù)庫用戶來連接數(shù)據(jù)庫,一個(gè)數(shù)據(jù)庫用戶會(huì)對(duì)應(yīng)多個(gè)應(yīng)用用戶。比如在Piwigo11.5.0的test_piwigo.php中[15],root用戶被配置為數(shù)據(jù)庫連接用戶,在應(yīng)用運(yùn)行時(shí),root用戶對(duì)應(yīng)的是所有的應(yīng)用用戶。在這種情況下,DBMS就沒有辦法確定當(dāng)前的應(yīng)用用戶,因此單純使用數(shù)據(jù)庫本身的訪問控制機(jī)制來實(shí)現(xiàn)應(yīng)用的訪問控制難以實(shí)現(xiàn)。
SDBatis基于MyBatis實(shí)現(xiàn),不依靠數(shù)據(jù)庫訪問控制機(jī)制,避免了連接池帶來的問題,同時(shí)其具有對(duì)數(shù)據(jù)庫進(jìn)行較細(xì)粒度的行級(jí)訪問控制的能力。
在應(yīng)用層實(shí)現(xiàn)訪問控制的方式分為兩種:一種是開發(fā)人員自己在代碼中嵌入判斷語句;另一種是使用安全框架。在Piwigo中,開發(fā)人員采用的是嵌入判斷語句的方式。如圖2所示,在Piwigo 11.5.0的group_perm.php文件中,falsify代表改動(dòng)狀態(tài),cat_true代表當(dāng)前類別的選中狀態(tài),開發(fā)人員對(duì)請(qǐng)求中這兩個(gè)參數(shù)進(jìn)行判斷,符合條件才定義SQL語句并執(zhí)行。嵌入代碼的方式對(duì)開發(fā)人員有較高的安全技術(shù)要求,并且在訪問控制策略較為復(fù)雜時(shí),訪問控制相關(guān)的代碼開發(fā)會(huì)非常繁瑣且難以維護(hù)。另外,安全性上,開發(fā)過程中出現(xiàn)漏洞幾乎是不可避免的。
圖2 Piwigo訪問控制代碼示例Fig.2 Piwigo access control code example
安全框架的典型是Apache Shiro[16]。安全框架根據(jù)會(huì)話中用戶的身份信息和設(shè)定的訪問控制策略來判斷當(dāng)前請(qǐng)求是否符合訪問控制策略。若不符合,會(huì)攔截資源請(qǐng)求。我們?cè)赗uoYi 4.6.1的us?er.html文件中找到了一個(gè)使用Shiro進(jìn)行按鈕訪問控制的示例[17]。應(yīng)用用戶向服務(wù)端請(qǐng)求顯示按鈕時(shí),由于此按鈕配置了shiro:hasPermission="sys?tem:user:add"語 句,Shiro將 會(huì)攔截該請(qǐng)求并在Realm類中尋找權(quán)限信息。如圖3所示,該函數(shù)在會(huì)話管理器中讀取當(dāng)前會(huì)話中的應(yīng)用用戶,根據(jù)用戶id通過持久層框架MyBatis在數(shù)據(jù)庫中查找角色和權(quán)限信息[18],然后將其添加在info中并返回給授權(quán)器。授權(quán)器將當(dāng)前用戶的權(quán)限信息與按鈕需要的"system:user:add"權(quán)限進(jìn)行比較以決定按鈕是否顯示。
圖3 RuoYi中Shiro流程示例Fig.3 Shiro process example in RuoYi
但在使用安全框架實(shí)現(xiàn)應(yīng)用訪問控制的方式中,開發(fā)人員需要完成的工作包括制定策略、實(shí)現(xiàn)策略和權(quán)限判斷。開發(fā)人員首先需要制定策略,然后將用戶、角色、權(quán)限及其關(guān)系定義在數(shù)據(jù)庫的表中以實(shí)現(xiàn)策略,最后在訪問敏感資源處添加安全相關(guān)代碼,在安全框架中配置權(quán)限信息的獲取方式以實(shí)現(xiàn)權(quán)限判斷。這會(huì)導(dǎo)致整個(gè)訪問控制功能與數(shù)據(jù)庫、業(yè)務(wù)代碼、安全框架都有關(guān)聯(lián)。由于安全相關(guān)代碼分布在各處,因此依然存在開發(fā)繁瑣、維護(hù)困難等問題。
本文提出的SDBatis避免了上述問題,在SDBatis中只需要配置訪問控制策略和獲取當(dāng)前應(yīng)用用戶上下文屬性就能夠完成訪問控制工作,使得開發(fā)和維護(hù)更為簡(jiǎn)便。
SDBatis的目標(biāo)包括:
1)基于持久層框架實(shí)現(xiàn),在保證訪問控制功能模塊獨(dú)立的前提下,能夠兼容不同的數(shù)據(jù)庫,能夠更準(zhǔn)確和方便地獲取應(yīng)用用戶上下文信息;應(yīng)用SDBatis時(shí)只需在持久層制定訪問控制策略、配置獲取當(dāng)前應(yīng)用用戶上下文屬性就能夠完成訪問控制工作,不再需要在業(yè)務(wù)代碼、安全框架等處編寫訪問控制相關(guān)代碼,也不再需要在數(shù)據(jù)庫中使用權(quán)限表格,減小應(yīng)用訪問控制功能開發(fā)和維護(hù)的成本。
2)使用CBAC作為訪問控制模型,相比于傳統(tǒng)的RBAC,更適用于動(dòng)態(tài)系統(tǒng),能實(shí)現(xiàn)更加靈活的訪問控制。
3)支持對(duì)數(shù)據(jù)庫的行級(jí)訪問控制,能夠確保應(yīng)用用戶無法訪問數(shù)據(jù)庫中超出其權(quán)限的行,從而最大程度地保證數(shù)據(jù)庫中的數(shù)據(jù)不會(huì)被越權(quán)訪問。
為實(shí)現(xiàn)上述目標(biāo),我們將SDBatis設(shè)計(jì)為如圖4所示的結(jié)構(gòu),主要包括SDBatis判斷器、訪問控制策略文件和SDBatis重寫器等。在業(yè)務(wù)邏輯需要與數(shù)據(jù)庫進(jìn)行交互時(shí),SDBatis將攔截所有經(jīng)過MyBatis的SQL語句相關(guān)對(duì)象,讀取訪問控制策略和應(yīng)用當(dāng)前用戶上下文信息,判斷當(dāng)前應(yīng)用用戶的上下文是否滿足訪問控制策略,然后根據(jù)判斷結(jié)果交給SDBatis重寫器進(jìn)行重寫,最后將SQL語句相關(guān)對(duì)象交還給MyBatis繼續(xù)執(zhí)行。
圖4 SDBatis結(jié)構(gòu)Fig.4 SDBatis structure
SDBatis的訪問控制策略以基于上下文的訪問控制為基礎(chǔ)。在基于上下文的訪問控制中,主體和請(qǐng)求的上下文是評(píng)估一個(gè)訪問請(qǐng)求的依據(jù)。我們借鑒了Shebaro等[19]描述在移動(dòng)設(shè)備中基于上下文的訪問控制模型的方法,并根據(jù)SDBatis的應(yīng)用場(chǎng)景做出了一些調(diào)整,策略定義如下:
定義1單個(gè)上下文屬性:CONTEXT=[CONTEXT_TYPE,CONTEXT_VALUE]。其中,CONTEXT_TYPE為上下文的類型,CONTEXT_VALUE代表上下文的值。
定義2上下文組c由多個(gè)CONTEXT組成:c=[CONTEXT 1,CONTEXT 2,CONTEXT 3,…]。
定義3訪問請(qǐng)求r=,其中s∈Sub?ject,為 應(yīng) 用 用 戶;o=[TABLE_NAME,ROW_VALUE,COLUMN_NAME]∈Object,代表訪問目標(biāo),為數(shù)據(jù)庫中表的行與列其中ROW_VALUE和COLUMN_NAME允許為“*”,代表任意行或列;a代表動(dòng)作組,a=[Action1,Action2,…],Action代表動(dòng)作,即為對(duì)數(shù)據(jù)庫中的條目進(jìn)行的操作,Action∈{“SELECT”,“INSERT”,“UPDATE”,“DE?LETE”}。
定義4訪問控制策略p=
根據(jù)上下文類型的不同,SDBatis中的訪問控制策略可以分為三類:環(huán)境策略、動(dòng)態(tài)行策略、連接策略。
環(huán)境策略:訪問環(huán)境指用戶發(fā)出請(qǐng)求時(shí)所擁有的上下文屬性,如設(shè)備信息、IP地址、訪問時(shí)間等。策略p1表示一條只允許用戶在早上9點(diǎn)到晚上7點(diǎn)之間對(duì)職員的工資信息進(jìn)行任何操作的策略,p1屬于限制訪問emp_salary表的策略。SDBatis中定義的時(shí)間格式為:“YY-MM-DD-hh:mm:ss”,其中YY代表年份,MM代表月份,DD代表日,hh代表小時(shí),mm代表分鐘,ss代表秒。那么p1的形式化表示如下
動(dòng)態(tài)行策略:SDBatis能夠完成行級(jí)的訪問控制,即限制應(yīng)用只能訪問數(shù)據(jù)庫中的哪一行或哪些行。在實(shí)際的應(yīng)用中,行策略往往需要根據(jù)當(dāng)前用戶的上下文而變化,如不同職員的職員id不同,策略限制其能夠訪問的數(shù)據(jù)庫表中的行也不同。SDBatis支持這樣的動(dòng)態(tài)表示。我們采用與MyBatis中表達(dá)動(dòng)態(tài)變量類似的語法來表示這樣的策略屬性,如在策略p2中使用了#{emp Id}表示當(dāng)前職員的id。策略p2表示職員只能查詢自己的工資信息,即只能查詢?cè)趀mp_salary表中emp_id與自己的職員id對(duì)應(yīng)的一行。p2的形式化表示如下
連接策略:在實(shí)際應(yīng)用中,SQL語句中往往會(huì)出現(xiàn)多表聯(lián)合查詢的情況,這種情況下策略依然以行策略的方式表示,但在判斷和重寫階段,SDBatis會(huì)分析當(dāng)前SQL語句中涉及的所有表以及策略中對(duì)應(yīng)的限制條件。
在SDBatis中,訪問控制策略使用xml文件存儲(chǔ),以基于上下文的訪問控制規(guī)則制定,角色、環(huán)境都被視為上下文屬性。xml文件的大致結(jié)構(gòu)為:在根節(jié)點(diǎn) SDBatis主要在MyBatis的基礎(chǔ)上增加了3個(gè)文件:sdbatis-strategy.xml、SDBatisInterceptor.java和SDBatisUtils.java。其中,sdbatis-strategy.xml為訪問控制策略文件;SDBatisInterceptor.java為SDBatis主體文件,SDBatis判斷器、重寫器都包含在這個(gè)文件中;SDBatisUtils.java中儲(chǔ)存工具函數(shù)。 MyBatis插件機(jī)制為攔截SQL語句相關(guān)的對(duì)象和對(duì)它們進(jìn)行操作提供了接口,SDBatis攔截器攔截MyBatis的Executor類中的query和update函數(shù),在這兩個(gè)函數(shù)執(zhí)行前攔截器會(huì)讀取函數(shù)變量。在MyBatis中,SELECT語句的處理將會(huì)調(diào)用query函數(shù),而DELETE、UPDATE、INSERT語句的處理會(huì)調(diào)用update函數(shù),所以query和update變量中包含了該次調(diào)用對(duì)數(shù)據(jù)庫的請(qǐng)求的具體參數(shù)。獲取到參數(shù)后,SDBatis從應(yīng)用層獲得當(dāng)前應(yīng)用用戶上下文信息,然后讀取訪問控制策略文件,根據(jù)用戶上下文、訪問控制策略、SQL語句進(jìn)行判斷,如果當(dāng)前執(zhí)行的對(duì)象與訪問控制策略不相關(guān),則不進(jìn)行處理;如果相關(guān),SDBatis會(huì)重寫變量,使變量符合訪問控制策略中的限制,從而確保發(fā)送給數(shù)據(jù)庫的SQL語句不會(huì)超出當(dāng)前用戶的權(quán)限,達(dá)到對(duì)數(shù)據(jù)庫的行的訪問控制的目的。最后,SDBatis用重寫后的變量替換函數(shù)中原來的變量,剩余的執(zhí)行過程交回給My Batis。SDBatis判斷器和重寫方法是SDBatis中的兩個(gè)重要組成部分,下面對(duì)它們進(jìn)行描述。 SDBatis判斷器:判斷器的主要功能是判斷當(dāng)前執(zhí)行的SQL語句相關(guān)對(duì)象與訪問控制策略是否相關(guān)。這個(gè)過程需要讀取訪問控制策略文件和解析SQL語句。dom4j是一個(gè)處理xml文件的工具[20],它解決了訪問控制策略文件的讀取和解析問題;JSqlParser是一個(gè)常用的解析SQL語句的工具[21],但由于其效率較差,我們只用它對(duì)SQL語句進(jìn)行了簡(jiǎn)單的分析,提取SQL語句中包含的表名、WHERE語句表。后續(xù)的判斷中,首先根據(jù)表名稱找到限制條件,再將限制條件與當(dāng)前用戶上下文進(jìn)行對(duì)比,如果沒有對(duì)應(yīng)的限制條件或滿足限制條件則不做處理;若不滿足限制條件,則根據(jù)限制條件的種類將當(dāng)前的請(qǐng)求置為空或重寫當(dāng)前SQL語句相關(guān)對(duì)象。 重寫方法:在MyBatis中對(duì)SQL語句進(jìn)行重寫并不能通過簡(jiǎn)單地替換SQL語句中的字符串完成。在MyBatis的設(shè)計(jì)里,SQL語句支持動(dòng)態(tài)變量,MyBatis插件的功能局限性使得SDBatis攔截器無法直接攔截到最終執(zhí)行的SQL語句,而只能獲取到未填寫變量的SQL語句和變量對(duì)象。我們研究了這些對(duì)象,設(shè)計(jì)了替換和添加兩種方式來完成對(duì)不同SQL語句的重寫功能。若WHERE語句中已經(jīng)包含限制類型但值與策略不符時(shí)使用替換的方法,替換指使用訪問控制策略中規(guī)定的值替換當(dāng)前參數(shù)中的變量;若WHERE語句中不包含限制類型,需要重寫時(shí),在未填寫變量的SQL語句后添加AND語句,如此也能完成對(duì)SQL語句的訪問限制。在該過程中有一個(gè)特例,INSERT語句不包含WHERE子句,因此處理方式與其他語句不同。我們對(duì)INSERT語句的處理方式相對(duì)簡(jiǎn)單,只需要判斷當(dāng)前用戶上下文是否滿足對(duì)當(dāng)前SQL語句中相關(guān)表的插入要求,若有,則允許插入;若沒有,則禁止插入。 SDBatis支持以MyBatis作為持久層框架的應(yīng)用。實(shí)驗(yàn)中,我們選擇了在github上擁有1.1k Star的RuoYi作為實(shí)驗(yàn)對(duì)象,實(shí)現(xiàn)了SDBatis的一個(gè)原型?;赗uoYi項(xiàng)目的基本業(yè)務(wù)邏輯,策略文件中的測(cè)試訪問控制策略配置如表1所示。 表1 測(cè)試訪問控制策略配置Table 1 Test security access control policy configuration 以未使用SDBatis的RuoYi應(yīng)用執(zhí)行的請(qǐng)求為基準(zhǔn)(base),根據(jù)設(shè)定的訪問控制策略和RuoYi的業(yè)務(wù)邏輯,我們制定了3組對(duì)照實(shí)驗(yàn)。第1組實(shí)驗(yàn)將使用硬編碼和SDBatis進(jìn)行權(quán)限控制的方法和基準(zhǔn)值進(jìn)行比較,其中測(cè)試硬編碼方法時(shí)對(duì)RuoYi源代碼進(jìn)行了人工分析和簡(jiǎn)單修改。第2組實(shí)驗(yàn)中請(qǐng)求被分為6類,每一類請(qǐng)求的類型和描述如表2中所示,該組實(shí)驗(yàn)主要測(cè)試了SDBatis在各類訪問控制條件下的表現(xiàn)。第3組實(shí)驗(yàn)重點(diǎn)測(cè)試行策略請(qǐng)求,請(qǐng)求共分為3類,包括簡(jiǎn)單行策略請(qǐng)求、嵌套查詢請(qǐng)求、連接策略請(qǐng)求等,3類請(qǐng)求分別在RuoYi原生和使用SDBatis之后兩種場(chǎng)景下測(cè)試。 表2 測(cè)試請(qǐng)求Table 2 Test request 實(shí)驗(yàn)測(cè)試的環(huán)境為:Inter Xeon E3-1230 V 2 3.3 GHz CPU,16 GB RAM,256 GB SSD,WINDOWS 10操作系統(tǒng),IntelliJIDEA開發(fā)工具,RuoYi 4.6.2。實(shí)驗(yàn)測(cè)試分為功能測(cè)試和性能測(cè)試兩部分。功能測(cè)試指對(duì)SDBatis能否完成預(yù)期功能的測(cè)試,測(cè)試的主要方法為人工檢驗(yàn)請(qǐng)求的測(cè)試結(jié)果與預(yù)期結(jié)果是否匹配;性能測(cè)試指測(cè)試每一類請(qǐng)求運(yùn)行的時(shí)間,對(duì)比各種情況下運(yùn)行時(shí)間的差異,從而研究SDBatis對(duì)應(yīng)用運(yùn)行效率的影響。 執(zhí)行測(cè)試請(qǐng)求時(shí),每一類測(cè)試分別執(zhí)行100次并計(jì)算平均時(shí)間,每次執(zhí)行時(shí)使用SpringBoot中的StopWatch工具對(duì)程序運(yùn)行時(shí)間進(jìn)行記錄和計(jì)算[22]。 實(shí)驗(yàn)結(jié)果分為功能測(cè)試結(jié)果和性能測(cè)試結(jié)果兩部分。在3組實(shí)驗(yàn)的功能測(cè)試中,SDBatis成功達(dá)到了對(duì)時(shí)間策略、IP策略、動(dòng)態(tài)行策略請(qǐng)求處理的預(yù)期。我們?nèi)斯し治隽薘uoYi本身的訪問控制方法,并將SDBatis與其進(jìn)行比較,得到如表3中所示的結(jié)果。結(jié)果表明使用SDBatis后只需要配置訪問控制策略文件即可完成權(quán)限判斷,降低了訪問控制功能開發(fā)的成本,且SDBatis支持行級(jí)訪問控制,比RuoYi原生的訪問控制方式更加靈活。 表3 訪問控制功能比較Table 3 Compar ison of access contr ol functions 第1組實(shí)驗(yàn)的性能測(cè)試結(jié)果如表4所示,結(jié)果表明,相比于RuoYi使用安全框架進(jìn)行訪問控制的方式,使用硬編碼所需時(shí)間減少了約7%,而使用SDBatis的方式增加了約20%的時(shí)間。第2組實(shí)驗(yàn)的性能測(cè)試結(jié)果如圖5,time1和time2分別代表滿足和不滿足訪問控制策略的時(shí)間相關(guān)請(qǐng)求,IP1和IP2分別代表滿足和不滿足訪問控制策略的IP相關(guān)請(qǐng)求,row代表動(dòng)態(tài)行策略請(qǐng)求。使用SDBatis后,時(shí)間策略和IP地址策略相關(guān)請(qǐng)求的運(yùn)行時(shí)間增加了約20%,而行策略請(qǐng)求運(yùn)行時(shí)間增加了34%。行策略請(qǐng)求運(yùn)行時(shí)間更長(zhǎng),這可能是因?yàn)樵谔幚硇胁呗哉?qǐng)求中需要對(duì)SQL語句進(jìn)行分析和重寫。 圖5 各類策略請(qǐng)求測(cè)試運(yùn)行時(shí)間Fig.5 Various types of strategy request test run time 表4 不同訪問控制方式耗時(shí)Table 4 Running time of different access control ways 圖6顯示了第3組實(shí)驗(yàn)的性能測(cè)試結(jié)果,在RuoYi原生訪問控制下,請(qǐng)求的執(zhí)行時(shí)間變化較小,而在使用SDBatis后,嵌套查詢請(qǐng)求和連接策略請(qǐng)求會(huì)分別多花費(fèi)6%和8%的時(shí)間,原因可能是這兩類請(qǐng)求的SQL語句更為復(fù)雜,所需的分析時(shí)間更長(zhǎng)。綜合3組實(shí)驗(yàn)結(jié)果,我們發(fā)現(xiàn)SDBatis對(duì)應(yīng)用性能有一定的影響,但在SDBatis帶來的優(yōu)勢(shì)下,這種程度的性能影響是可以接受的。 圖6 行策略請(qǐng)求測(cè)試運(yùn)行時(shí)間Fig.6 Row strategy request test run time 本文提出了一種新的對(duì)應(yīng)用的訪問控制解決方案:SDBatis。相比于以往的訪問控制系統(tǒng),SDBatis可以讓開發(fā)人員在持久層中完成訪問控制工作,降低了訪問控制功能開發(fā)的成本。另外,SDBatis基于CBAC和MyBatis插件模型開發(fā),與前人研究開發(fā)的SafeD和Qpala相比,SDBatis中以CBAC的訪問控制模型為基礎(chǔ),環(huán)境策略和動(dòng)態(tài)行策略使其能夠適應(yīng)日益復(fù)雜的訪問環(huán)境,而基于MyBatis開發(fā)的理念使其能被各類使用MyBatis作為持久層框架的應(yīng)用使用。在實(shí)際應(yīng)用中,SDBatis帶來的延遲也是可以接受的。未來,我們希望能設(shè)計(jì)出兼容性更高、適用性更廣、使用門檻更低的訪問控制系統(tǒng),SDBatis只是一次初步的嘗試。在SDBatis中,持久層框架MyBatis是基礎(chǔ),而未來的研究將不限于單一的框架。最后,SDBatis在處理SQL語句和策略文件時(shí)的效率還有待提高,對(duì)于復(fù)雜SQL語句的判斷和重寫仍需進(jìn)一步完善。標(biāo)簽代表一張表,而
標(biāo)簽內(nèi)的每個(gè)
3.2 功能實(shí)現(xiàn)
4 實(shí)驗(yàn)與分析
4.1 實(shí)驗(yàn)方案
4.2 結(jié)果與分析
5 結(jié)語