[英]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.