2012-06-05 34 views
4

我正在開發的當前項目是一個Web應用程序,它必須在自己的服務器上交付給多個客戶。該網站需要一個權限控制系統,用於管理用戶可以或不可以使用的區域和功能。
至於知道,我正在設計一個數據庫驅動的權限系統,權限存儲在數據庫中。每個用戶都有一個角色。該角色定義可用的列表權限。該模式是這樣的:網站權限系統的最佳實踐

用戶
1. USER_ID
2名
3. ROLE_ID

角色
1. ROLE_ID
2名

權限
1. permission_id
2名

roles_permissions表:
1. ROLE_ID
2. permission_id

在我能賣登錄用戶的角色和權限的代碼,並檢查用戶能夠執行操作或看到像這樣的區域:

if($user->hasPermission('Edit HR')) { 
    // let user see the editing HR section 
} 

hasPermission會檢查用戶是否有權限一個名字'編輯人力資源',並將返回所需的結果。我看到的問題是數據庫表必須具有名稱完全是「編輯HR」而不是「Edit_hr」或「HR編輯」的權限記錄。所以我必須確保權限系統的數據與應用程序使用的每個數據庫相同。哪種讓我覺得這是一個有缺陷的設計,需要重新設計。創建新的部分和功能還需要更新所有的數據庫,這也使我成爲一隻可悲的熊貓。

因此,基本上,問題是:設計數據庫驅動的權限系統並在多個數據庫上保持數據庫完整性的最佳方式是什麼?

+0

要澄清的設計,我會打電話的表'role','resource'和'permission'。權限表將包含「role_id」和「resource_id」的外鍵,如果存在任何條目,則知道該角色已連接到該資源。另外,由於您已經擁有名爲'[table] _id'的FK,我會調用每個PK'id'。 – Xeoncross

+0

用戶只能有一個角色?那麼一個類別的編輯和另一個類別的審稿人呢? :) –

+0

這是很好的問題是,當你的角色,工藝在混合,你需要解釋一下,如果用戶不需要只從一個用戶添加更多的權限,以一個用戶或用戶組或排除permison,你想獲得這個方案這一翻譯:http://stackoverflow.com/questions/37466333/php-mysql-sesion-good-practice-user-management-and-permissions –

回答

1

你提出的方案看起來很好。我唯一要補充的是在permissions表中,我將添加一個名爲tag或類似的字段。

權限tag將類似於EDIT_HR,您可以將其用作代碼中的參考,而不是其name。使用name僅用於顯示目的,例如HR Editing。這樣,名稱可以根據需要改變,並且不會影響您的代碼。

0

我使用的解決方案是擁有一個全局$ current_user對象,該對象在創建時讀取權限表並存儲對其有效的所有權限操作。然後,只要需要檢查某個操作,就會搜索該數組。它節省了數據庫查詢,但是如果將這種數據存儲在全局對象中存在安全隱患,我還沒有找到它。

有(樣品)需要的只有1 db表:

user_id | user_role | user_action 
--------------------------------- 
0  | 10  | view_dashboard 
0  | 1  | view_users 

用戶角色對應最小用戶類型(管理員,編輯,訪客等),所以用USER_ROLE> = $ CURRENT_USER角色的所有動作可用。 user_id列允許您覆蓋特定用戶的某些級別。

在這種設置中,它也很容易有一個頁面,其中列出的所有權限,並允許用戶修改與一個簡單的下拉列表中的值(但要確保不是每個用戶都可以做到這一點)。