漫談權限系統之基于ACL的實現
基于ACL的實現
ACL介紹
ACL全稱Access Control List,在ACL中,包含用戶(User)、資源(Resource)、資源操作(Operation)三個關鍵要素。通過將資源以及資源操作授權給用戶而使用戶獲取對資源進行操作的權限,模型如下圖所示:
圖表 1 ACL模型
實現方案
通過上面對ACL模型的介紹,可以看出ACL是個簡單的模型,但其并未提出對于權限的繼承、權限的排斥和包含的解決方案。
ACL模型得到接受必然也是有它的理由的,現在來看看基于ACL模型如何來實現授權模型和權限校驗部分。
l 授權模型
授權模型遵循ACL模型進行搭建,建立ACL介紹中的模型。
針對授權模型中的幾個關鍵部分進行描述:
n 授權
根據ACL模型,授權動作主要經過以下幾個步驟完成:
u 配置系統資源和資源的操作
按照模型維護Resource、Operation實體以及Resource與Operation的關聯模型即可實現。
u 授予用戶能操作的資源和資源的操作
按照模型維護用戶與Resource以及Operation的關聯即可實現。
n 權限的繼承
在ACL模型中未定義權限的繼承,這也是由于在ACL的模型中根本就沒有權限繼承的點,因為用戶本身是不可能繼承的。
在很多改良的ACL模型系統中,會通過給組或組織機構授權來完成,這時就出現了權限繼承的點了,如組或組織機構的權限繼承,那么在ACL模型中如何去實現這個權限繼承呢?
為實現給組或組織機構進行授權,此時通常需要對上述ACL模型進行改造方可實現,模型重構如下:
圖表 2 重構后的ACL模型
在對組或組織機構進行授權動作時,經過以下步驟來實現權限的繼承:
u 維護當前組或組織機構中所有用戶的ACL模型
維護當前組或組織機構和Resource、Operation的關聯模型。
遞規獲取當前組或組織機構的父節點的ACL模型,并合并形成新的Resource、Operation關聯列表,此時獲取該組或組織機構中的用戶產生用戶和Resource、Operation的關聯ACL模型。
u 維護當前組或組織機構中所有下級節點中的所有用戶的ACL模型
遞規獲取當前組或組織機構的子節點,同時合并形成子節點新的Resource、Operation關聯列表,之后獲取子節點中的用戶產生新的Resource、Operation關聯列表。
在經過以上的步驟后權限的繼承得以實現,在使用過程中同時發現另外一個問題,在更新組或組織機構下的用戶時需要同時維護當前組或組織機構的ACL模型,否則會造成不同步的問題。
n 權限的排斥和包含
權限的排斥和包含在ACL模型中同樣沒有定義,通常的實現方法是定義Operation的自關聯,維護時需增加對Operation自關聯的維護以及在維護User、Resource、Operation關聯時根據Operation的自關聯產生其包含權限的ACL列表。
l 資源權限校驗
在以上授權模型的基礎上,對于操作主體能否對資源進行操作權限的判斷通過ACL列表直接判斷用戶是否具有對資源進行操作的權限即可。
通常在中小型系統的做法是在用戶登錄時獲取構成用戶的ACL列表,以提升資源權限校驗的效率。
l 數據權限校驗
在ACL模型中未明確定義數據權限校驗的實現,根據數據權限校驗的需求將數據映射為Resource,對數據的操作映射為Operation,這個時候數據權限的授權模型重構為:
圖表 3 數據權限的ACL模型
基于此模型對數據權限的授權和權限校驗進行描述:
n 授權
在對數據進行授權時根據模型此時的授權對象主要有User、Group兩種,授權時需要通過以下步驟來完成:
u 維護數據本身構成的ACL模型
維護當前數據、操作與Group、User的關聯模型。
遞規獲取當前數據、操作的父節點的Group、User的關聯模型,合并組成新的Group、User列表,根據此列表形成對當前數據進行操作的用戶列表,此時更新形成UseràResourceàOperation的ACL列表模型。
u 維護數據所有子節點的ACL模型
遞規獲取數據的所有子節點,同時對合并形成每個子節點的新的Group、User列表,更新子節點的UseràResourceàOperation的ACL列表模型。
在經過以上的步驟后數據權限的繼承以及需求得以實現,在使用過程中同時發現另外一個問題,在更新組或組織機構下的用戶時需要同時維護當前組或組織機構的ACL模型,否則會造成不同步的問題。
n 權限校驗
u 獲取操作者權限范圍內的全部數據
直接通過UseràResourceàOperation的ACL列表獲取所有數據。
u 分頁獲取操作者權限范圍內的數據
直接通過UseràResourceàOperation的ACL列表分頁(結合數據庫的分頁技術)獲取數據。
優缺點分析
經過上述實現方案的描述,可以看出基于ACL的實現的優點主要在于:
n 易用和高效的權限校驗
在進行資源和數據的權限校驗時只需通過通過ACL列表即可實現。
缺點在于:
n 權限的繼承
對權限繼承不夠支持。
n 復雜和低效的授權方式
在進行資源和數據的授權時非常復雜,特別是在加入權限的繼承、排斥和包含后,需要在維護本身ACL列表的同時維護所有子節點的ACL列表,導致效率低下。
posted on 2005-10-13 18:13 BlueDavy 閱讀(5856) 評論(1) 編輯 收藏 所屬分類: Java 、系統設計