[導(dǎo)入]權(quán)限系統(tǒng)(1)--基本模式
Posted on 2005-11-26 10:39 canonical 閱讀(980) 評(píng)論(0) 編輯 收藏 所屬分類: 設(shè)計(jì)理論 在系統(tǒng)中發(fā)生的事情,抽象的說都是某個(gè)主體(subject)在某個(gè)資源(resource)上執(zhí)行了某個(gè)操作(operation)。
subject --[operation]--> resource
所謂權(quán)限管理,就是在這條信息傳遞路徑中加上一些限制性控制。
主體試圖去做的 limited by 系統(tǒng)允許主體去做的 = 主體實(shí)際做的。
可以看到,權(quán)限控制基本對(duì)應(yīng)于filter模式。subject試圖去做的事情應(yīng)該由業(yè)務(wù)邏輯決定,因而應(yīng)該編碼在業(yè)務(wù)系統(tǒng)中。
先考慮最粗粒度的控制策略,控制點(diǎn)加在subject處,即無論從事何種操作,針對(duì)何種資源,我們首先需要確認(rèn)subject是受控的。只有通過認(rèn)證的用
戶才能使用系統(tǒng)功能,這就是authentication。boolean isAllowed subject)
稍微復(fù)雜一些,控制可以施加在subject和operation的邊界處(此時(shí)并不知道具體進(jìn)行何種操作),稱為模塊訪問控制,即只有某些用戶才能訪問特定模塊。isAllowed(subject, operation set)
第三級(jí)控制直接施加在operation上,即操作訪問控制。operation知道resource和subject(但它尚沒有關(guān)于resource
的細(xì)節(jié)知識(shí)),我們能夠采取的權(quán)限機(jī)制是bool isAllowed(subject, operation, resource),
返回true允許操作,返回false則不允許操作。
最簡單的情況下,subject與resource之間的訪問控制關(guān)系是靜態(tài)的,可以直接寫成一個(gè)權(quán)限控制矩陣
for operationA:
resourceA resourceB
subjectA 1 0
subjectB 0 1
isAllowed(subjectA, resourceA)恒等于true
如果多個(gè)operation的權(quán)限控制都可以通過這種方式來表示,則多個(gè)權(quán)限控制矩陣可以疊加在一起
for operationA, operationB:
resourceA resourceB
subjectA 10 01
subjectB 01 11
當(dāng)subject和resource的種類很多時(shí),權(quán)限控制矩陣急劇膨脹,它的條目數(shù)是N*M。很顯然,我們需要進(jìn)行矩陣分解。這也是最基本的控制手段之一: 在系統(tǒng)中增加一個(gè)瓶頸,或者說尋找到隱含的結(jié)構(gòu)。
subject_resource = subject_role * role_resource
這
樣系統(tǒng)權(quán)限配置條目的數(shù)量為 N*R + R*M, 如果R的數(shù)目遠(yuǎn)小于subject和resource,則實(shí)現(xiàn)簡化。這稱為RBAC(role
based access control),它的一個(gè)額外好處是權(quán)限系統(tǒng)的部分描述可以獨(dú)立于subject存在,即在系統(tǒng)中沒有任何用戶的時(shí)候,通過角色仍然可以表達(dá)部分權(quán)限信息。可以說角色是subject在權(quán)限系統(tǒng)中的代理(分解)。
有時(shí)候引入一個(gè)瓶頸還不過癮,有人引入組的概念,與role串聯(lián),
subject_resource = subject_group_role * role_resource
或著group與role并聯(lián),
subject_resource = subject_group * group_resource
與role稍有不同,一般情況下group的業(yè)務(wù)含義更加明顯,可能對(duì)應(yīng)于組織結(jié)構(gòu)等。將組織機(jī)構(gòu)明確引入權(quán)限體系,有的時(shí)候比較方便,但對(duì)于權(quán)限系統(tǒng)自 身的穩(wěn)定性而言,未見得有什么太大的好處。并聯(lián)模式有些多余,串聯(lián)模式又過于復(fù)雜,細(xì)節(jié)調(diào)整困難,特別是多條控制路徑造成的沖突情況。一般情況下,我不提 倡將group引入權(quán)限控制中。
比操作控制更加深入的控制就是數(shù)據(jù)控制了,此時(shí)需要對(duì)于resource的比較全面的知識(shí)。雖然表面上,仍然是
boolean isAllowed(subject, operation,
resource),但控制函數(shù)需要知道resource的細(xì)節(jié)。例如行級(jí)控制(row-level)或者列級(jí)控制(column-level)的實(shí)現(xiàn)。
因?yàn)槲覀円话闱闆r下不可能將每一個(gè)條目都建模為獨(dú)立的resource,而只能是存在一個(gè)整體描述,例如所有密級(jí)為絕密的文檔。在witrix平臺(tái)中,數(shù)
據(jù)控制主要通過數(shù)據(jù)源的filter來實(shí)現(xiàn),因?yàn)椴樵儣l件(數(shù)據(jù)的定位條件)已經(jīng)被對(duì)象化為Query類,所以我們可以在合適的地方自由的追加權(quán)限控制條
件。
以上的討論中,權(quán)限控制都是根據(jù)某些靜態(tài)描述信息來進(jìn)行的,但現(xiàn)實(shí)世界是多變的。最簡單的,當(dāng)subject從事不同業(yè)務(wù)時(shí),對(duì)應(yīng)于同一組資源,也可能對(duì) 應(yīng)的權(quán)限控制并不同(在witrix平臺(tái)中,對(duì)應(yīng)于IDataSource的模式切換)。更復(fù)雜一些, 在不同的時(shí)刻, 我們需要根據(jù)其他附加信息來作出是否允許操作的判斷, 即此時(shí)我們權(quán)限設(shè)置的不僅僅是一些靜態(tài)的描述信息, 而是一個(gè)完整的控制函數(shù), 這就是所謂的工作流權(quán)限控制,一種動(dòng)態(tài)權(quán)限控制.