2012-06-28 36 views
2

我仍然在我的ACL項目中工作,並且想要針對以下問題的一些想法:ACL建模 - 如何管理訪問控制列表的「層次結構」?

我正在使用MySQL來存儲我的用戶,角色和權限。起初,我在我的TABLE角色中創建了一個字段「parent_id」,並試圖通過這個來管理每個用戶的權限。這是一種有效的工作,直到我意識到如果我添加一個新角色,管理層次結構和控制誰可以訪問哪些資源非常複雜。我做了一些搜索,發現使用關係數據庫處理層次結構非常複雜,所以我放棄了使用層次結構。

我想你的幫助找到管理用戶創建的最佳解決方案: 我有4個不同的用戶:SuperAdmin,CustomerAdmin,Technician,client。 當我在頁面中創建新用戶時,我不想讓技術人員創建類型爲CustomerAdmin或SuperAdmin的新用戶。

我認爲只讓SuperAdmin創建一個新用戶,但我的一個約束是我必須讓CustomerAdmin也創建用戶,也是技術人員。

爲了更有說服力,SuperAdmin可以成爲我。客戶管理員是我的客戶,他有一個企業。在他的企業中,他可以創建兩種類型的用戶:技術人員和客戶。

這只是一個例子,但是如果我想創建一個新的角色給他新的權限,我必須找到一種方法來拒絕他創建比他更強大的用戶的權限。

我不確定我的問題是否客觀,但任何能夠與我討論此事的人都會受到歡迎。

+0

根據關係數據庫的性質來建模樹是非常困難的,但它並不適合在單個查詢中對數據結構進行建模。我之前在PostgreSQL中使用了所謂的物化路徑,但是我的實現使用了MySQL缺少的一些功能。我使用了所謂的物化路徑,並使用可寫視圖+ ltree來實現它。用MySQL做這件事的最好方法很可能是將數據拉出並通過遍歷數據來構建樹,儘管在PHP中構建樹型數據結構會讓我不寒而慄。 – hsanders

+0

我明白了你的意思..但我真的必須找到一種方法來以最簡單的方式解決這個問題..它不應該是這個怪物 – Periback

回答

4

您已經擁有自己的角色,但每個角色都需要有權執行操作。這幾乎肯定是過度的,但它應該是高度靈活的。

 
| Role Table       | 
| Role ID | Role Name | Access Level | 
---------------------------------------- 
|  1 | SuperAdmin |   10 | 
|  2 | ClientAdmin |   20 | 
|  3 | Technician |   40 | 
|  4 | Client  |   80 | 

| Action Table   | 
| Action ID | Action Name | 
--------------------------- 
|   1 | Create User | 
|   2 | Delete User | 
Etc. 

| Rights Table     | 
| Right ID | Role ID | Action ID | 
---------------------------------- 
|  1 |  1 |   1 | 
|  2 |  1 |   2 | 
|  3 |  2 |   1 | 
|  4 |  2 |   2 | 
Etc. 

| Parameter Table           | 
| Param ID | Right ID | Parameter Name | Parameter Value | 
----------------------------------------------------------- 
|  1 |  1 | Max User Access |    10 | 
|  2 |  2 | Max User Access |    10 | 
|  3 |  3 | Max User Access |    20 | 
|  4 |  4 | Max User Access |    20 | 
Etc. 

Rights表顯示SuperAdmin和ClientAdmin都可以創建和刪除用戶。參數表限制ClientAdmin創建最大訪問級別爲20(最高爲1)的用戶。您可以將此訪問級別與角色匹配,以便爲Role.Access_Level> = Max User Access的新用戶提供角色列表。

操作可以根據權利使用多個參數集,但我想不出除最大用戶訪問以外的任何其他參數。

1

如果您使用權限值類型的方案,其中數字表示權限「級別」,並且在某些增量下您獲得某些權限,該怎麼辦?

E.G.

超級管理員10000 客戶管理員1000 技術員100 苦工10

能讀= 10 能寫設置= 100 可以創建用戶1000

如果操作的目標用戶具有更高的權限號碼比執行該操作的用戶,否認該操作。這是一個非常簡單的方法來抽象這些意思,而不是構建物化路徑並且必須構建樹數據結構。

+0

這可能是一個有趣的想法(不同的,我會說,我認爲的一切),但問題是我使用Zend_Acl(沒有插件因爲我必須使用個性化的MVC框架),我的函數檢查用戶是否被允許,獲取角色ID,資源和權限),以及它在數據庫中被驗證,如果在我的ACL_Role表中有一個註冊表:role_id = 5,Resource_id = 2,permission = read,我檢查:check(5,2,read)。如果沒關係,則返回1,否則返回0.我認爲遵循你的想法,我將無法繼續使用ACL。 ( 我可能錯了)。 – Periback

+0

您可能必須自定義您現有的ACL解決方案才能使用這些內容。我認爲要做到這一點,無論如何你都需要定製它。您可以爲每個現有角色定義角色級別,然後只進行數字比較,而不是使用它來定義整個系統,而這將需要對您正在使用的內容進行較少的修改。 – hsanders