使用按位运算符的不同模块的用户角色权限

时间:2010-05-27 21:50:35

标签: php mysql database-design bit-manipulation

所以我有一个应用程序,它有几个模块(将模块视为不同的页面),每个模块都有一组权限;查看,添加,编辑,删除

我希望每个用户角色都拥有每个模块的权限,例如

  

角色权限

     

模块1 - >查看
  模块2 - >添加,编辑
  模块3 - >查看,添加,编辑,删除
  等

我如何设计数据库以支持它以及如何使用按位运算符来实现它(或者对于这种特殊情况会有更有效的方法吗?)

我已经拥有了user,user_role和role表,但我不确定如何设计Module表。

2 个答案:

答案 0 :(得分:4)

这里我将展示如何使用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;

将一些样本数据插入表中。

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'(位= 1)和'Blog-Delete'(位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;

示例数据 -

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

答案 1 :(得分:3)

如果您决定使用位掩码,请记住您可以跟踪的权限数量是有限的(您可以在签名的4字节整数数据库列中跟踪31个权限)。然后为每个权限分配一个2的幂(1,2,4,8等)的值,并且您可以执行按位操作以检查权限匹配。

根据您要完成的内容,我建议您创建一个role_has_module_privs表。从查询的角度来看,这种方法可扩展性更高,效率更高。但是如果你的组合数量有限,那么位掩码可能会更有效率。