2012-04-25 78 views
6

我正在爲我們公司開發一個應用程序,最終將有許多限制用戶使用特定部分/模塊的方法。雖然應用程序仍然很小,但我想轉向一種新的存儲權限的方法,隨着應用程序的增長,維護和查詢仍然很容易。將應用程序權限存儲在數據庫中

當前在我們的MySQL數據庫中,我們有一個名爲「user」的表,用於存儲用戶的ID,用戶名和密碼。在所謂的「user_acl」一個單獨的表如下:

user_acl_id 
acl_root 
acl_news_read 
acl_news_write 
acl_news_modify 
acl_reports_read 
acl_reports_write 
acl_reports_modify 
acl_users_read 
acl_users_write 
acl_users_modify 

我們只有在分3個模塊,但隨着時間的推移更將被創建併爲每個權限將需要添加。

而不是爲每個權限創建一個列,有沒有其他方式或存儲此信息?

回答

24

我會這樣做。

table name: permission 
columns: id, permission_name 

,然後我可以用一個多對多的關係表

table name: user_permission 
columns: permission_id, user_id 

分配多個權限給用戶這樣的設計可以讓我添加儘可能多的權限,因爲我想,並將其分配給作爲許多用戶,因爲我想要的。

雖然上述設計符合您的要求,但我有自己的方法在我的應用程序中實現ACL。我在這裏發佈。

我實現ACL的方法是這樣的:

  1. 用戶將被分配一個角色(管理員,客人,員工,公衆)
  2. 一個角色都會有一個或分配給他們的許多權限( user_modify,report_read等)
  3. 用戶的權限將從他/她所擔任的角色繼承
  4. 除了角色繼承的權限外,還可以爲用戶分配手動權限。

爲此,我想出了以下數據庫設計。

role 
I store the role name here 
+----------+ 
| Field | 
+----------+ 
| id  | 
| roleName | 
+----------+ 

permission: 
I store the permission name and key here 
Permission name is for displaying to user. 
Permission key is for determining the permission. 
+----------------+ 
| Field   | 
+----------------+ 
| id    | 
| permissionName | 
| permissionKey | 
+----------------+ 

role_permission 
I assign permission to role here 
+---------------+ 
| Field   | 
+---------------+ 
| id   | 
| role_id  | 
| permission_id | 
+---------------+ 

user_role 
I assign role to the user here 
+---------------+ 
| Field   | 
+---------------+ 
| id   | 
| user_id  | 
| role_id  | 
+---------------+ 

user_permission 
I store the manual permission I may allow for the user here 
+---------------+ 
| Field   | 
+---------------+ 
| id   | 
| user_id  | 
| permission_id | 
+---------------+ 

這讓我更好地控制ACL。我可以允許superadmins自己分配權限,等等。正如我所說,這只是給你的想法。

+0

如何添加有關角色,如管理公共等額外的信息?例如管理員有一些額外添加像公司名稱..和用戶沒有這個領域? – james 2014-01-01 10:26:19

+0

我會存儲信息在相關的實體,你可以添加額外的列到表中,如果你想添加一個角色的更多信息,那麼你可以在角色表中添加額外的列,同樣的用戶表 – 2014-01-01 13:32:34

0

我相信你應該以jSON格式製作這些權限。

您可以創建另一個具有權限的表,您可以隨時添加,修改或刪除行。

每個用戶進行身份驗證,您可以存儲這些權限在會議並把它傳遞到腳本的時間。

我個人的建議是第一種選擇。

0

就像易卜拉欣說的,專門爲您的權限創建一個新表。爲用戶分配一個代表其權限級別的數值,如1 =讀取,2 =寫入/讀取,3 =修改/寫入/讀取。然後在您的代碼中,在允許用戶執行特定任務之前檢查適當的權限級別。如果他們沒有所需的值(3修改或> = 2寫),那麼你阻止該能力。

0

我想你應該有最喜歡的表:

user 
user_x_profile 
profile 
profile_x_function 
function 

您設置各種「通用」配置文件「瀏覽器」,「僱員」,「經理」等

你建立一個「功能「輸入你想要控制的每個對象。

然後將函數鏈接到profile_x_function中的配置文件。

然後爲每個用戶分配一個或多個配置文件。

這削減了管理工作。假設你想添加另一個只有「管理者」可以使用的函數 - 你只需要在函數表中添加一個新條目,然後在「profile_x_function」表中添加一個條目,該條目鏈接到「manager」配置文件管理者配置文件的權限並可供所有管理人員使用。

要查詢訪問權限,您需要五個表連接,但您只選擇一個permision屬性。

相關問題