Posted on 2005-11-26 10:46
canonical 閱讀(655)
評(píng)論(0) 編輯 收藏 所屬分類:
設(shè)計(jì)理論
權(quán)限控制中,subject可能不會(huì)簡(jiǎn)單的對(duì)應(yīng)于userId, 而是包含一系列的security token或certificate,
例如用戶登陸地址,登陸時(shí)間等。一般情況下,這些信息在權(quán)限系統(tǒng)中的使用都是很直接的,不會(huì)造成什么問題。
subject域中最重要的結(jié)構(gòu)是user和role的分離,可以在不存在user的情況下,為role指定權(quán)限。有人進(jìn)一步定義了userGroup的
概念,可以為userGroup指定role,而user從其所屬的group繼承role的設(shè)置。一般情況下,我不提倡在權(quán)限系統(tǒng)中引入
userGroup的概念。這其中最重要的原因就是它會(huì)造成多條權(quán)限信息傳遞途徑,從而產(chǎn)生一種路徑依賴,
并可能出現(xiàn)信息沖突的情況。一般user與group的關(guān)聯(lián)具有明確的業(yè)務(wù)含義,因而不能隨意取消。如果我們希望對(duì)user擁有的權(quán)限進(jìn)行細(xì)調(diào),除去
user從group繼承的某個(gè)不應(yīng)該擁有的權(quán)限,解決的方法很有可能是所謂的負(fù)權(quán)限,即某個(gè)權(quán)限條目描述的是不能做某某事。負(fù)權(quán)限會(huì)造成各個(gè)權(quán)限設(shè)置之
間的互相影響,造成必須嘗試所有權(quán)限規(guī)則才能作出判斷的困境,引出對(duì)額外的消歧策略的需求,這些都極大的限制了系統(tǒng)的可擴(kuò)展性。在允許負(fù)權(quán)限的環(huán)境中,管
理員將無法直接斷定某個(gè)權(quán)限設(shè)置的最終影響,他必須在頭腦中完成所有的權(quán)限運(yùn)算之后才能理解某用戶最終擁有的實(shí)際權(quán)限,如果發(fā)現(xiàn)權(quán)限設(shè)置沖突,管理員可能
需要多次嘗試才能找到合適方案。這種配置時(shí)的推理需求可能會(huì)增加配置管理的難度,造成微妙的安全漏洞,而且負(fù)權(quán)限導(dǎo)致的全局關(guān)聯(lián)也降低了權(quán)限系統(tǒng)的穩(wěn)定
性。我更傾向于將group作為權(quán)限設(shè)置時(shí)的一種輔助標(biāo)記手段,系統(tǒng)中只記錄用戶最終擁有的角色,即相當(dāng)于記錄用戶通過group擁有權(quán)限的推導(dǎo)完成的結(jié)
果,
如果需要權(quán)限細(xì)調(diào),我們直接在用戶擁有的角色列表上直接進(jìn)行。當(dāng)然,如果實(shí)現(xiàn)的復(fù)雜一些,權(quán)限系統(tǒng)對(duì)外暴露的接口仍然可以模擬為能夠指定
userGroup的權(quán)限。
推理在面向?qū)ο笳Z言中最明顯的表現(xiàn)是繼承,所以有些人將subject域中的推理直接等價(jià)于role之間的繼承問題,這未必是最好的選擇。繼承可以形成非
常復(fù)雜的推理關(guān)系,但是可能過于復(fù)雜了(特別是直接使用sql語句無法實(shí)現(xiàn)樹形推理查詢)。按照級(jí)列理論,從不相關(guān)發(fā)展到下一階段是出現(xiàn)簡(jiǎn)單的序關(guān)系,即
我們可以說subject出現(xiàn)級(jí)別上的差異,高級(jí)別subject將自動(dòng)具有低級(jí)別的權(quán)限。一種選擇是定義roleRank,規(guī)定高級(jí)別role自動(dòng)具有
低級(jí)別role的權(quán)限,但考慮到user與role的兩分結(jié)構(gòu),我們也可以同時(shí)定義userRank和roleRank,規(guī)定高級(jí)別user自動(dòng)具有低級(jí)
別的role,而role之間不具有推理關(guān)系。在面向?qū)ο箢I(lǐng)域中,我們已經(jīng)證實(shí)了完全采用繼承來組織對(duì)象關(guān)系會(huì)導(dǎo)致系統(tǒng)的不穩(wěn)定,所以我傾向于第二種選
擇,即將role看作某種類似于interface的東西,一種權(quán)限的切片。為了進(jìn)一步限制這種推導(dǎo)關(guān)系,我們可以定義所謂的安全域的概念.
security domain, 規(guī)定推導(dǎo)只能在一定的域中才能進(jìn)行。
select user.userId, role.roleId
from user, role
where user.userRank > role.roleRank
and user.domain = role.domain
將權(quán)限控制一般需要施加在最細(xì)的粒度上,這在復(fù)雜的系統(tǒng)中可能過于理想化了。復(fù)雜的情況下我們需要進(jìn)行局部化設(shè)計(jì),即進(jìn)行某些敏感操作之前進(jìn)行一系列復(fù)雜
的權(quán)限校驗(yàn)工作。當(dāng)完成這些工作之后,進(jìn)入某個(gè)security zone, 在其中進(jìn)行操作就不再需要校驗(yàn)了。
總的來說,權(quán)限系統(tǒng)采用非常復(fù)雜的結(jié)構(gòu)效果未必理想。很多時(shí)候只是個(gè)管理模式的問題,應(yīng)該盡量通過重新設(shè)計(jì)權(quán)限空間的結(jié)構(gòu)來加以規(guī)避。不過在一些非常復(fù)雜
的權(quán)限控制環(huán)境下,也許簡(jiǎn)單的描述信息確實(shí)很難有效的表達(dá)權(quán)限策略(雖然我從未遇到過),此時(shí)嘗試一下規(guī)則引擎可能比在權(quán)限系統(tǒng)中強(qiáng)行塞入越來越多的約束
要好的多。