1 權(quán)限控制體系中的基本概念
1.1 身份與主題
身份(Principal)描述的是用戶以及和用戶相關(guān)的社會(huì)關(guān)系的屬性,例如角色、群組、職位等等。
主題(Subject)是身份的集合,描述的是一個(gè)用戶所具有的所有身份。
下圖表示用戶的身份:
圖1 用戶身份關(guān)系圖
1.2 資源與資源域
資源是系統(tǒng)中的一種存在,包括具體資源和抽象資源。
具體資源,是實(shí)實(shí)在在的資源,例如系統(tǒng)模塊、頁(yè)面中的按鈕、等等。
抽象資源,可以說是一種描述性資源,例如表達(dá)式資源等。
資源域(Resource Domain)是系統(tǒng)中資源的類別,是對(duì)多樣性資源的一種劃分方式。
一個(gè)資源域可以包含多種類型的資源,資源的類型在.net中可以用代表該資源的類來表示,同一種類型的資源是以資源的標(biāo)識(shí)來加以區(qū)分的。
一個(gè)資源在系統(tǒng)中的是以“資源域-資源類型-資源標(biāo)識(shí)”來唯一標(biāo)識(shí)和定位的。
資源域的一個(gè)例子:
圖2 資源域?qū)嵗龍D
1.3 操作
操作(Action),描述的是對(duì)某種資源可能的行為,對(duì)于某種資源往往可能有多種操作,例如對(duì)于文檔資源,可能的操作為查看(view)、編輯(edit)、刪除(delete)、移動(dòng)(move)等。
如果對(duì)于某種資源的操作較多,可能會(huì)出現(xiàn)某些操作之間有包含關(guān)系,而某些操作之間沒有包含關(guān)系的情況。例如上面對(duì)于文檔的幾種操作中,一般拉來說,編輯應(yīng)該包含查看,而刪除應(yīng)該包含編輯等等,而編輯和移動(dòng)之間就不一定有包含關(guān)系。
對(duì)于操作之間的包含關(guān)系,可以通過下面的樹形結(jié)構(gòu)來說明:
圖3 資源操作圖
1.4 許可與權(quán)限
許可(Permission)描述的是對(duì)系統(tǒng)中資源的操作,“通常一個(gè)許可包含一個(gè)目標(biāo)(‘由這個(gè)權(quán)限控制的操作將對(duì)誰(shuí)執(zhí)行?’)和一個(gè)操作(‘如果這個(gè)權(quán)限允許的話,對(duì)這個(gè)目標(biāo)將執(zhí)行什么操作?’)”。
許可=資源 + 操作。
權(quán)限,可以認(rèn)為是對(duì)許可的一種更為常用的說法,在實(shí)際的程序設(shè)計(jì)中,權(quán)限往往被附加上了身份的描述。
權(quán)限=[身份+]資源+ 操作。
1.5 允許權(quán)限與拒絕權(quán)限
? 允許權(quán)限,明確允許身份A能夠?qū)Y源B進(jìn)行C操作,例如允許小王對(duì)工程管理模塊進(jìn)行管理操作。
? 拒絕權(quán)限,明確拒絕身份A能夠?qū)Y源B進(jìn)行C操作,例如不允許小王對(duì)工程管理模塊進(jìn)行管理操作。
? 如果一個(gè)系統(tǒng)中沒有明確允許身份A能夠?qū)Y源B進(jìn)行C操作,那么并不代表系統(tǒng)就拒絕了身份A能夠?qū)Y源B的C操作。
圖 4 允許權(quán)限與拒絕權(quán)限示意圖
1.6 傳播權(quán)限與阻止權(quán)限
? 傳播權(quán)限,明確允許或拒絕身份A能夠?qū)Y源B進(jìn)行C操作,并將該描述已資源B為祖先向下傳播,即身份A對(duì)資源B及B的子孫資源都能夠進(jìn)行C操作。
? 阻止權(quán)限,即在傳播源的子孫(某些)節(jié)點(diǎn)阻止祖先傳播權(quán)限在那些節(jié)點(diǎn)的傳播,即一旦在某節(jié)點(diǎn)阻止了祖先在該點(diǎn)的傳播權(quán)限,則該阻止自動(dòng)往下傳播。
圖 5 傳播權(quán)限與阻止權(quán)限圖
圖 7 基于角色的權(quán)限控制模型圖
1.7 各種權(quán)限類型的聯(lián)系與區(qū)別
從概念上說,允許權(quán)限與拒絕權(quán)限是一對(duì),而傳播權(quán)限和阻止權(quán)限是一對(duì)。
允許/拒絕權(quán)限是資源點(diǎn)上權(quán)限的橫向描述,而傳播/阻止權(quán)限是資源點(diǎn)上權(quán)限的縱向描述。
拒絕權(quán)限與阻止權(quán)限的區(qū)別:如果在某個(gè)節(jié)點(diǎn)設(shè)置了對(duì)某個(gè)集合身份(例如群組)的拒絕權(quán)限,則該集合身份下的人,無(wú)論他們有多少其他身份,也無(wú)論這些其他身份是否設(shè)置了允許權(quán)限,最終都會(huì)因?yàn)榫芙^權(quán)限而拒絕。而阻止權(quán)限與此不同,例如我們?cè)O(shè)置了對(duì)傳播權(quán)限的一個(gè)阻止權(quán)限,同時(shí)在該節(jié)點(diǎn)又設(shè)置了允許權(quán)限,則我們先計(jì)算自身的拒絕與允許權(quán)限,然后才計(jì)算傳播與阻止權(quán)限,因此阻止權(quán)限并不能阻止該節(jié)點(diǎn)的關(guān)聯(lián)的允許或拒絕權(quán)限。
2 權(quán)限控制模型
2.1 主體-客體權(quán)限控制模型
? 出現(xiàn)于早期的應(yīng)用之中。在這里,主體相當(dāng)于系統(tǒng)的訪問者,客體相當(dāng)于系統(tǒng)的資源。
? 主體對(duì)于客體是否能夠訪問,一般是通過一個(gè)矩陣實(shí)現(xiàn)的。
? 優(yōu)點(diǎn):授權(quán)關(guān)系明確,直截了當(dāng),存取都很容易。
? 缺點(diǎn):不能適應(yīng)變化。
圖 6 主體-客體權(quán)限控制模型圖
2.2 基于任務(wù)的權(quán)限控制模型
? 任務(wù)是工作流程中的一個(gè)邏輯單元,一個(gè)流程一般包含一到多個(gè)任務(wù)。
? 所謂基于任務(wù),簡(jiǎn)單的說,就是主體在不同的任務(wù)中被許可的權(quán)限可能是不一樣的,即使是在一個(gè)任務(wù)中,那么權(quán)限也會(huì)隨著任務(wù)生命周期的不同而有所不同。
? 因?yàn)闄?quán)限隨著任務(wù)和任務(wù)狀態(tài)的不同而不同,所以這是一種動(dòng)態(tài)的權(quán)限控制模型。
? 優(yōu)點(diǎn):適合于與上下文環(huán)境關(guān)聯(lián)緊密或者需要?jiǎng)討B(tài)授權(quán)的應(yīng)用系統(tǒng),例如工作流引擎的權(quán)限控制。
? 缺點(diǎn):只適應(yīng)于某些應(yīng)用系統(tǒng),絕大多數(shù)系統(tǒng)更為需要的是靜態(tài)權(quán)限控制模型。
2.3 基于角色的權(quán)限控制模型
? 以角色為橋梁,將用戶和資源連接起來,用戶對(duì)某個(gè)資源是否能夠訪問,取決于該用戶所對(duì)應(yīng)的角色是否能夠?qū)δ硞€(gè)資源訪問。
? 優(yōu)點(diǎn):適應(yīng)變化。
? 缺點(diǎn):用戶只能通過角色與資源打交道,那么為了某些特殊的用戶,系統(tǒng)中不得不創(chuàng)建一些特殊的角色,這些角色實(shí)際上已經(jīng)弱化為用戶了。
2.4 綜合權(quán)限控制模型
? 以角色為橋梁,將用戶和資源連接起來,用戶對(duì)某個(gè)資源是否能夠訪問,取決于該用戶所對(duì)應(yīng)的角色是否能夠?qū)δ硞€(gè)資源訪問。
? 以群組為擴(kuò)展,將某一組織或者群體下的用戶統(tǒng)一授權(quán),用戶對(duì)某個(gè)資源是否能夠訪問,取決于該用戶所對(duì)應(yīng)的群組是否能夠?qū)δ硞€(gè)資源訪問。
? 優(yōu)點(diǎn):授權(quán)方面、靈活。
? 缺點(diǎn):權(quán)限控制較難,計(jì)算復(fù)雜,運(yùn)算效率低。
圖8 綜合權(quán)限控制模型圖
2.5 模型總體視圖
權(quán)限功能組件
圖10權(quán)限功能組件
模型中重要的對(duì)象
身份(Principal)
圖11權(quán)限的身份
資源(Resource)
資源域(Resource Domain)
? 提供資源域管理界面,通過該界面可以建立新的資源域,并向域中加入某類或多類資源,還可以配置資源的權(quán)限描述類
? 資源域的對(duì)外服務(wù)是通過系統(tǒng)資源服務(wù)類實(shí)現(xiàn)的 ,這些服務(wù)包括:定位域中的資源、確定資源的組織方式等等
操作(Action)
? 支持操作之間的包含關(guān)系,而且支持包含關(guān)系的傳遞,即如果Action1>Action2,Action2>Action3,則Action1>Action3
許可(Permission)
? 許可,在Trix_X中是對(duì)某種資源關(guān)于權(quán)限方面的描述,例如該資源中包含哪些操作,這些操作之間的包含關(guān)系又是怎樣的等等,這些都是在許可中定義的
3 權(quán)限控制策略
權(quán)限的優(yōu)先級(jí)策略:對(duì)于同一個(gè)資源,拒絕權(quán)限>允許權(quán)限>繼承權(quán)限。
組織結(jié)構(gòu)分級(jí)管理策略,即組織機(jī)構(gòu)中某個(gè)部門的管理員,只能對(duì)本部門及本部門的子孫部門的人員進(jìn)行授權(quán)。
權(quán)限的傳播與阻止策略,該策略主要應(yīng)用于樹形資源的授權(quán),目前尚未考慮組織結(jié)構(gòu)這中樹形結(jié)構(gòu)對(duì)權(quán)限的影響。
超級(jí)管理員策略:系統(tǒng)中一直存在一個(gè)超級(jí)管理員帳號(hào),用于進(jìn)行最高級(jí)。
權(quán)限計(jì)算過程
圖12 權(quán)限計(jì)算過程圖
4 權(quán)限控制體系功能描述
以資源域?yàn)橹行慕y(tǒng)一管理、配置資源及相關(guān)信息
1) 資源域是系統(tǒng)中某類或某幾類資源的集合。
2) 提供資源域管理界面,通過該界面可以建立新的資源域,并向域中加入某類或多類資源,還可以配置資源的權(quán)限描述類。
相當(dāng)靈活的授權(quán)方式
1) 以身份為中心授權(quán):以身份為中心設(shè)置對(duì)哪些資源能夠進(jìn)行哪些訪問等等,入口分散在人員、群組、組織機(jī)構(gòu)的管理中。
2) 以資源為中心授權(quán):以資源為中心,授予哪些身份對(duì)該資源可以進(jìn)行哪些訪問等等,該方式又分為兩種:
(1) 資源集中授權(quán):權(quán)限控制中心將各種資源域的資源以一系列樹的方式集中在一起顯示并進(jìn)行授權(quán)。
(2) 資源分散授權(quán):任意一種資源,只要將資源標(biāo)識(shí)(ID)、資源對(duì)象類(class全名)傳給權(quán)限控制體系,則控制中心會(huì)彈出通用的授權(quán)界面,設(shè)置哪些身份對(duì)該資源可以進(jìn)行哪些訪問等等。
資源的權(quán)限描述可以通過可插拔的權(quán)限描述類來實(shí)現(xiàn)
1) 權(quán)限描述類,主要負(fù)責(zé)描述該資源對(duì)外提供哪些操作以及其他一些信息等等。
2) 在我們的體系中,每種資源都可以使用自己編寫的權(quán)限描述類,也可以更換權(quán)限描述類。
對(duì)于某種資源可能的操作,可以定義這些操作之間的包含關(guān)系。
支持樹形資源的授權(quán),并支持權(quán)限的繼承與傳播。
權(quán)限控制中心,在計(jì)算權(quán)限結(jié)果時(shí),如果最終拒絕該請(qǐng)求,則會(huì)給出為什么不允許訪問:是明確拒絕,還是因?yàn)椴荒苡?jì)算出是否被拒絕而出于安全考慮才不允許訪問的?如果是后者,對(duì)于關(guān)聯(lián)資源的權(quán)限判斷將很有幫助。
尊重業(yè)務(wù)邏輯判斷,支持業(yè)務(wù)對(duì)訪問請(qǐng)求的優(yōu)先判斷
在系統(tǒng)資源服務(wù)接口中定義了checkPermission方法,做為業(yè)務(wù)自身實(shí)現(xiàn)該接口操作后,在對(duì)某個(gè)請(qǐng)求進(jìn)行訪問控制時(shí),我們現(xiàn)將控制權(quán)交給實(shí)現(xiàn)了該接口的業(yè)務(wù)自身,并傳給業(yè)務(wù)足夠的請(qǐng)求信息,業(yè)務(wù)自身對(duì)該請(qǐng)求進(jìn)行業(yè)務(wù)邏輯判斷后,可能會(huì)形成三種結(jié)果:
1) 明確拒絕該請(qǐng)求,如果業(yè)務(wù)自身明確拒絕該請(qǐng)求,則權(quán)限控制體系將直接拒絕該請(qǐng)求,不再交給權(quán)限體系自身進(jìn)行判斷。
2) 明確允許該請(qǐng)求 ,如果業(yè)務(wù)自身明確允許該請(qǐng)求,則權(quán)限控制體系將直接允許該請(qǐng)求,不再交給權(quán)限體系自身進(jìn)行判斷。
3) 不確定是否允許訪問,如果業(yè)務(wù)自身不知道是否允許或拒絕該請(qǐng)求,則權(quán)限控制體系會(huì)將控制權(quán)轉(zhuǎn)交給權(quán)限判斷中心進(jìn)行進(jìn)一步判斷。
5 權(quán)限存儲(chǔ)
權(quán)限的動(dòng)作存儲(chǔ)我們用位來表示,把所有可能的權(quán)限按一定的順序排列,如添加、瀏覽、修改、刪除...,用戶的權(quán)限值為固定長(zhǎng)度的字符串,如100010100001....01,從右起每一位對(duì)應(yīng)一種操作權(quán)限,如果有這種權(quán)限,則此位的值為1,反之,則為0。當(dāng)然,在數(shù)據(jù)庫(kù)中,實(shí)際是存的2的n次方的計(jì)算結(jié)果數(shù)字,如0、1、2、4、8…,MS SQL數(shù)據(jù)庫(kù)最大的數(shù)字是2的64次方,且保證盡可能多地存放權(quán)限,所以我們給權(quán)限進(jìn)行了分組,每個(gè)64位的權(quán)限為一組,為了方便計(jì)算,組也是按2的n次方存放。同一組的權(quán)限位可按二進(jìn)制進(jìn)行與、或操作,只有該位為1表示有權(quán)限,否則沒有權(quán)限。
舉例如下:
權(quán)限排列表:添加、瀏覽、修改、刪除,用戶A有添加和瀏覽的的權(quán)限,則其權(quán)限值為0011,用戶B有瀏覽和修改的權(quán)限則其權(quán)限值為0110,用戶C有瀏覽和刪除的權(quán)限則其權(quán)限值為1010,這樣設(shè)計(jì)的好處為:當(dāng)權(quán)限表中增加別的權(quán)限時(shí),不會(huì)影響用戶表或角色表,大大節(jié)省存儲(chǔ)空間,并且提高查詢效率;
實(shí)際上數(shù)據(jù)庫(kù)中表示二進(jìn)制數(shù)據(jù)的方法是用數(shù)字類型字段來存儲(chǔ)。
應(yīng)用場(chǎng)景
用戶身份資源
下面次序圖描述了獲取用戶身份的各種場(chǎng)所,通過集合求和并排拆的方法求得用戶的身份集合。
圖13 應(yīng)用場(chǎng)景圖
用戶權(quán)限
下面此次序圖描述了獲取用戶權(quán)限的綜合應(yīng)用, 用戶權(quán)限包括應(yīng)用資源、菜單、操作對(duì)象、對(duì)象的屬性及對(duì)象的記錄。
圖14 用戶權(quán)限圖
7 實(shí)體類設(shè)計(jì)
圖15實(shí)體類
8 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
8.1 E-R關(guān)系圖
圖16 E-R關(guān)系圖
8.2 主要數(shù)據(jù)實(shí)體說明