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

问题描述 投票:0回答:3

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

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

角色 A 权限

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

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

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

php mysql database-design bit-manipulation
3个回答
9
投票

这里我展示了如何用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”拥有“用户添加”(位 = 1)和“博客删除”(位 64)权限,那么角色将为 65(1+64)。
如果用户“Mehata”拥有“博客查看”(位 = 128)和“用户删除”(位 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')

输出 = 无行。

点击此处了解更多信息。


5
投票

如果您决定使用位掩码,请记住您可以跟踪的权限数量是有限的(您可以在带符号的 4 字节整数数据库列中跟踪 31 个权限)。然后,每个权限都会被分配一个 2 的幂(1、2、4、8 等)的值,并且您可以执行按位运算来检查权限匹配。

根据您想要完成的任务,我建议创建一个 role_has_module_privs 表。从查询的角度来看,这种方法更具可扩展性并且更高效。但如果您的组合数量有限,位掩码可能会更有效。


0
投票

根据您提供的信息,您正在按“name='user-edit”进行过滤,但在表格中,“name”字段为 'User-Edit'(大写)。因此,使用“(select bit frompermission where name='user-edit')”进行搜索很可能不会返回任何数据。

© www.soinside.com 2019 - 2024. All rights reserved.