如何管理数据库中的用户角色?

Cap*_*tis 15 php mysql database-design

我正在创建一个网站,我将在其中管理用户及其权限.我正在寻找实现用户角色,似乎无法解决事情应该如何工作.我希望能够为用户分配某个角色,并让每个角色包含一个到多个权限,我的脚本可以轻松读取这些权限.只是想知道如何设置我的数据库来轻松高效地完成这项工作.

在我的脑海中,我想象了3个表(用户,角色和权限).我可以为每个用户提供一个加入角色表的角色ID,我只是不知道如何将角色链接到多个权限.

Mar*_*ker 42

我只是不知道如何将角色链接到多个权限.

您使用连接表:role_id和permission_id来标识与哪些角色关联的权限

编辑:

示例表

角色表

Role_ID Role_Name
1       Standard User
2       Super User
3       Guest
Run Code Online (Sandbox Code Playgroud)

许可表

Permission_ID Permission_Name
1             View User List
2             Update Own User Account
3             Update Any User Account
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

列出指定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 
Run Code Online (Sandbox Code Playgroud)

  • +1很棒的例子.我认为这篇文章将被搜索此类信息的许多用户引用. (8认同)

Sur*_*shi 5

我认为按位运算符是实现用户权限的最佳方式.在这里,我将展示如何使用Mysql实现它.

以下是包含一些示例数据的示例表:

表1:存储权限名称的权限表,如1,2,4,8..etc(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;
Run Code Online (Sandbox Code Playgroud)

将一些示例数据插入表中.

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');
Run Code Online (Sandbox Code Playgroud)

表2:用于存储用户ID,名称和角色的用户表.角色将计算为权限总和.
示例:
如果用户'Ketan'具有'User-Add'(bit = 1)和'Blog-Delete'(bit-64)的权限,那么角色将为65(1 + 64).
如果用户'Mehata'拥有'Blog-View'(位= 128)和'User-Delete'(位-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;
Run Code Online (Sandbox Code Playgroud)

样本数据-

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');
Run Code Online (Sandbox Code Playgroud)

用户的Loding权限登录后如果我们要加载用户权限,我们可以在下面查询以获取权限:

SELECT permission.bit,permission.name  
   FROM user LEFT JOIN permission ON user.role & permission.bit
 WHERE user.id = 1
Run Code Online (Sandbox Code Playgroud)

这里user.role"&"permission.bit是一个按位运算符,它将输出为 -

User-Add - 1
Blog-Delete - 64
Run Code Online (Sandbox Code Playgroud)

如果我们想查看天气,特定用户是否拥有用户编辑权限 -

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

输出=无行.

您还可以看到:http://goo.gl/ATnj6j