1. 程式人生 > >RBAC許可權模型及資料許可權擴充套件的實踐

RBAC許可權模型及資料許可權擴充套件的實踐

話說大家對RBAC許可權模型應該是耳熟能詳了,但真正用的好的並不多。而且原始的RBAC模型並不包含資料許可權的管理,網上也幾乎沒有相關的文章可以參考。本人經過幾個專案的實戰,在其基礎上擴展出一套可行的、簡單的資料許可權模型,希望能夠幫助大家解決資料許可權管理上的老大難問題。至於什麼是資料許可權,請移步我的其他文章,這裡不再敷述。


1、關於角色的繼承:

在上圖描述的模型中,並沒有實現角色的繼承。既然一個使用者可以分配多個角色,那麼角色能否繼承還有什麼必要呢?實現這個毫無必要的功能需要大大增加應用的複雜度,可謂是得不償失。

2、關於資源和功能:

大家可以從圖中看到只有一張表的一個欄位用來描述資源或功能的授權。在大多數場景中,資源和功能實際上無法進行嚴格的區分,有所區別的只是顆粒度的不同而已。一個業務組可以算是一種顆粒度最粗的資源,一個頁面或窗體相對就精細一些了;到頁面內選單、工具欄按鈕,就更精細了;如果控制的顆粒度達到頁面元素或介面控制元件的程度,就是最細顆粒度的許可權控制了。所以無論你叫資源還是功能、操作,都沒有區別,你要控制的就是那些東西,只需要你描述出來,就可以被控制。

3、關於資料許可權:

資料許可權的授權相對功能許可權來說,是完全不同的兩種型別。如何為資料授權,這必須從資料許可權的本質出發,從如何鑑別資料出發,只有能夠像鑑別資源一樣對資料加以鑑別,我們才能對資料進行正確的授權。

如果我們拋開資料值的不同(值的不同不是本質的不同)來分析資料,就會發現在一般場景中,資料的不同首先是業務型別的不同。譬如:訂單資料、結算資料、生產計劃資料等等。對於同一型別資料,還可以以產生資料的物件:業務部門、業務人員加以區分,這也是經常遇到的需求:經理可以看到所有的訂單,業務員只能看自己的。什麼叫全部?什麼叫自己的?前一個概念對於不同的業務部門,實際的內容往往並不相同,A經理的全部訂單指的是A部門的訂單;而B經理的全部訂單則是B部門的訂單。至於所謂的“自己的”,就更加明顯是一個相對概念了。張三的和李四的一般來說是不存在交集的。但有時候,也有一些絕對性的需求,譬如要求C部門的張三要管A部門訂單的稽核,同樣C部門的王五則負責B部門。

這樣,資料許可權的授權必須要從相對和絕對兩個維度進行定義,才能做到邏輯完備。所以模型中也通過兩張表來描述資料許可權,在相對模式中,用Mode欄位來描述不同的顆粒度,而在絕對模式中使用者可以直接指定部門或使用者的ID。此外,用ModuleId欄位來定義資料的型別,也就是產生業務的模組,這個欄位所包含的邏輯不僅是區別資料的業務型別,更重要的是為應用資料許可權提供依據。

4、關於許可權的應用:

本人在專案中,功能許可權和資料許可權都應用在資料訪問層,利用資料庫函式返回給應用程式被授權的資源或功能的ID集合。應用程式根據ID集合通過反射載入資源或功能,達到使用者不能訪問非授權資源的目的。資料許可權的應用方法也差不多,將資料庫函式join到業務表上去,未授權的業務資料就會被過濾掉,通過join增加的Permission列,則描述了該行資料的讀寫許可權為只讀還是讀寫。