RBAC权限模型及数据权限扩展的实践
話說大家對RBAC權限模型應該是耳熟能詳了。但真正用的好的并不多。并且原始的RBAC模型并不包括數(shù)據(jù)權限的管理,網(wǎng)上也差點兒沒有相關的文章可以參考。本人經(jīng)過幾個項目的實戰(zhàn),在其基礎上擴展出一套可行的、簡單的數(shù)據(jù)權限模型,希望可以幫助大家解決數(shù)據(jù)權限管理上的老大難問題。
至于什么是數(shù)據(jù)權限,請移步我的其它文章,這里不再敷述。
1、關于角色的繼承:
在上圖描寫敘述的模型中,并沒有實現(xiàn)角色的繼承。既然一個用戶能夠分配多個角色,那么角色是否能繼承還有什么必要呢?實現(xiàn)這個毫無必要的功能須要大大添加應用的復雜度,可謂是得不償失。
2、關于資源和功能:
大家能夠從圖中看到僅僅有一張表的一個字段用來描寫敘述資源或功能的授權。在大多數(shù)場景中,資源和功能實際上無法進行嚴格的區(qū)分。有所差別的僅僅是顆粒度的不同而已。一個業(yè)務組能夠算是一種顆粒度最粗的資源。一個頁面或窗口相對就精細一些了;到頁面內菜單、工具欄button,就更精細了。假設控制的顆粒度達到頁面元素或界面控件的程度,就是最細顆粒度的權限控制了。所以不管你叫資源還是功能、操作。都沒有差別。你要控制的就是那些東西,僅僅須要你描寫敘述出來,就能夠被控制。
3、關于數(shù)據(jù)權限:
數(shù)據(jù)權限的授權相對功能權限來說,是全然不同的兩種類型。怎樣為數(shù)據(jù)授權,這必須從數(shù)據(jù)權限的本質出發(fā),從怎樣鑒別數(shù)據(jù)出發(fā),僅僅有可以像鑒別資源一樣對數(shù)據(jù)加以鑒別,我們才干對數(shù)據(jù)進行正確的授權。
假設我們拋開數(shù)據(jù)值的不同(值的不同不是本質的不同)來分析數(shù)據(jù),就會發(fā)如今一般場景中,數(shù)據(jù)的不同首先是業(yè)務類型的不同。譬如:訂單數(shù)據(jù)、結算數(shù)據(jù)、生產(chǎn)計劃數(shù)據(jù)等等。
對于同一類型數(shù)據(jù),還能夠以產(chǎn)生數(shù)據(jù)的對象:業(yè)務部門、業(yè)務人員加以區(qū)分。這也是常常遇到的需求:經(jīng)理能夠看到所有的訂單,業(yè)務員僅僅能看自己的。
什么叫所有?什么叫自己的?前一個概念對于不同的業(yè)務部門,實際的內容往往并不相同。A經(jīng)理的所有訂單指的是A部門的訂單;而B經(jīng)理的所有訂單則是B部門的訂單。
至于所謂的“自己的”。就更加明顯是一個相對概念了。張三的和李四的一般來說是不存在交集的。但有時候。也有一些絕對性的需求。譬如要求C部門的張三要管A部門訂單的審核,相同C部門的王五則負責B部門。
這樣,數(shù)據(jù)權限的授權必需要從相對和絕對兩個維度進行定義,才干做到邏輯完備。所以模型中也通過兩張表來描寫敘述數(shù)據(jù)權限,在相對模式中,用Mode字段來描寫敘述不同的顆粒度,而在絕對模式中用戶能夠直接指定部門或用戶的ID。此外,用ModuleId字段來定義數(shù)據(jù)的類型,也就是產(chǎn)生業(yè)務的模塊。這個字段所包括的邏輯不僅是差別數(shù)據(jù)的業(yè)務類型,更重要的是為應用數(shù)據(jù)權限提供根據(jù)。
4、關于權限的應用:
本人在項目中,功能權限和數(shù)據(jù)權限都應用在數(shù)據(jù)訪問層。利用數(shù)據(jù)庫函數(shù)返回給應用程序被授權的資源或功能的ID集合。
應用程序依據(jù)ID集合通過反射載入資源或功能,達到用戶不能訪問非授權資源的目的。數(shù)據(jù)權限的應用方法也差點兒相同,將數(shù)據(jù)庫函數(shù)join到業(yè)務表上去,未授權的業(yè)務數(shù)據(jù)就會被過濾掉。通過join添加的Permission列,則描寫敘述了該行數(shù)據(jù)的讀寫權限為僅僅讀還是讀寫。
總結
以上是生活随笔為你收集整理的RBAC权限模型及数据权限扩展的实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更改分区目录图片
- 下一篇: Nerv --- React IE8