簡體   English   中英

如何管理數據庫中的用戶角色?

[英]How to manage User Roles in a Database?

我正在創建一個網站,我將在其中管理用戶及其權限。 我正在尋找實現用戶角色,並且似乎無法理解事情應該如何工作。 我希望能夠為用戶分配某個角色,並讓每個角色包含一到多個可以由我的腳本輕松讀取的權限。 只是想知道我應該如何設置我的數據庫以輕松有效地做到這一點。

在我的腦海中,我描繪了 3 個表(用戶、角色和權限)。 我可以給每個用戶一個加入角色表的角色 ID,我只是不知道如何將角色鏈接到多個權限。

我只是不知道如何將角色鏈接到多個權限。

您使用連接表:role_id 和permission_id 來標識哪些權限與哪些角色相關聯

編輯:

示例表

角色表

Role_ID Role_Name
1       Standard User
2       Super User
3       Guest

權限表

Permission_ID Permission_Name
1             View User List
2             Update Own User Account
3             Update Any User Account

ROLE_PERMISSION 表

Role_ID Permission_ID
1       1    // Role 1 (Standard User) grants View User List
1       2    //        and Update Own User Account
2       1    // Role 2 (Super User) grants View User List,
2       2    //        Update Own User Account,
2       3    //        and Update Any User Account
3       1    // Role 3 (Guest) grants View User List

列出指定 Role_ID 的權限

select R.role_id,
       P.permission_id,
       P.permission_name
  from role R,
       permission P,
       role_permission RP
 where RP.permission_id = P.permission_id
   and RP.role_id = R.role_id
   and R.role_id = 1 

我認為按位運算符是實現用戶權限的最佳方式。 在這里,我將展示如何使用 Mysql 實現它。

下面是帶有一些示例數據的示例表:

表 1 :存儲權限名稱的權限表,有點像 1,2,4,8.. 等(2 的倍數)

CREATE TABLE IF NOT EXISTS `permission` (
  `bit` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`bit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

在表中插入一些示例數據。

INSERT INTO `permission` (`bit`, `name`) VALUES
(1, 'User-Add'),
(2, 'User-Edit'),
(4, 'User-Delete'),
(8, 'User-View'),
(16, 'Blog-Add'),
(32, 'Blog-Edit'),
(64, 'Blog-Delete'),
(128, 'Blog-View');

表 2 :存儲用戶 ID、名稱和角色的用戶表。 角色將被計算為權限的總和。
例子 :
如果用戶 'Ketan' 擁有 'User-Add' (bit=1) 和 'Blog-Delete' (bit-64) 的權限,那么角色將是 65 (1+64)。
如果用戶 'Mehata' 擁有 'Blog-View' (bit=128) 和 'User-Delete' (bit-4) 權限,那么角色將是 132 (128+4)。

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `role` int(11) NOT NULL,
  `created_date` datetime NOT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

樣本數據-

INSERT INTO `user` (`id`, `name`, `role`, `created_date`)
   VALUES (NULL, 'Ketan', '65', '2013-01-09 00:00:00'),
   (NULL, 'Mehata', '132', '2013-01-09 00:00:00');

用戶的加載權限登錄后如果我們要加載用戶權限,我們可以在下面查詢以獲取權限:

SELECT permission.bit,permission.name  
   FROM user LEFT JOIN permission ON user.role & permission.bit
 WHERE user.id = 1

這里 user.role "&" permission.bit 是一個按位運算符,它將輸出為 -

User-Add - 1
Blog-Delete - 64

如果我們想檢查特定用戶是否擁有用戶編輯權限的天氣 -

  SELECT * FROM `user` 
     WHERE role & (select bit from permission where name='user-edit')

輸出 = 無行。

你也可以看到: http : //goo.gl/ATnj6j

這就是我通常做的事情:

您定義一組權限,其含義因目標對象而異,但其一般含義相同。 例如:

  • 附加
  • 刪除
  • 刪除內容
  • 讀取權限
  • 更改權限

然后你為每一個分配一點:

class Perms {
    const read           = 1;
    const write          = 2;
    const append         = 4;
    const delete         = 8;
    const deleteContents = 16;
    const readPerm       = 32;
    const changePerm     = 64;
    /* shortcuts */
    const fullControl    = 127; 
    const noControl      = 0;
}

然后,對於每種類型的對象,您都有一個表,您可以在其中插入對(user, perms) , (group, perms) , (role, perms)或任何您想與權限關聯的內容。

您可以像這樣查詢用戶(可能有多個角色)的權限:

//this will depend on the database
//you could also use whatever bitwise OR aggregate your database has
//to avoid the foreach loop below
$query = new Query(
    "select perm from objects_permissions as P ".
    "where P.id_object = \$1 and " .
    "   (P.role = any(\$2));",
    $obj->getId(), $user->getRoles()
);

$perms = 0;
foreach ($query as $row) {
    $perms |= $row['perm']; 
}

您還可以輕松添加拒絕權限。

如果你想走 3 張桌子的路線,你可以像這樣創建你的桌子:

Table       | Rows
User        | id ; name ; dob ; permission_id ; etc...  
Roles       | id ; add_post ; edit_post ; delete_post ; add_user ; etc...
Permissions | id ; user_id ; role_id 

我們使用 json 數據類型管理了兩個表,因此我們不需要任何重復條目,例如


Role_ID Permission_ID
1       1    
1       2 
Role Table

id, role_name
'1', 'read'
'2', 'write'
'3', 'update'
'4', 'all'
User Table

id,   name,   role_assign, role_type
'1', 'arjun', '[1, 2]',    'admin'
'2', 'dhruv', '[3, 4]',    'user'
Query

SELECT u.id,r.role_name,u.name FROM test.users u inner join
test.role r on JSON_CONTAINS(u.role_assign, cast(r.id as json));
Output

id,  role_name, name
'1', 'read',   'arjun'
'1', 'write',  'arjun'
'2', 'update', 'dhruv'
'2', 'all',    'dhruv'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM