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

Php 使用位运算符的不同模块的用户角色权限,php,mysql,database-design,bit-manipulation,Php,Mysql,Database Design,Bit Manipulation,所以我有一个应用程序,它有几个模块(把模块想象成不同的页面),每个模块都有一组权限;查看、添加、编辑、删除 例如,我希望每个用户角色对每个模块都有权限 角色A权限 模块1->查看 模块2->添加、编辑 模块3->查看、添加、编辑、删除 等等 我如何设计数据库来支持这一点?我将如何使用位运算符来实现它(或者对于这种特殊情况是否有更有效的方法?) 我已经有用户、用户角色和角色表,但我不确定如何设计模块表。如果您决定使用位掩码,请记住,您可以跟踪的权限数量是有限的(您可以在有符号的4字节整数数据库列中

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

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

角色A权限

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

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


我已经有用户、用户角色和角色表,但我不确定如何设计模块表。

如果您决定使用位掩码,请记住,您可以跟踪的权限数量是有限的(您可以在有符号的4字节整数数据库列中跟踪31个权限)。然后,将为每个权限分配一个二次幂的值(1、2、4、8等),您可以执行逐位操作来检查权限匹配情况


从您希望实现的目标来看,我建议改为创建一个role\u has\u module\u privs表。从查询的角度来看,这种方法更具可扩展性和效率。但是如果您有有限数量的组合,则位掩码可能更有效。

这里我将展示如何使用Mysql实现它

下面是一些示例数据的示例表:

表1:存储权限名称的权限表,如1,2,4,8..等(2的倍数)

在表中插入一些示例数据

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”拥有“Blog View”(位=128)和“user Delete”(位-4)的权限,那么角色将为132(128+4)

样本数据-

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')
输出=无行


您还可以看到:

“将模块视为不同的页面”-在这种情况下,您通常(/始终?)只需要检查每个请求的一个权限,如“x允许‘编辑’y吗?”好吧,例如,假设有一个联系人模块,它是一个联系人管理系统,并非所有组都可以访问该模块,或者可能具有有限的访问权限(视图)等。因此,如果允许组编辑模块a,则可能不允许组编辑模块BI。我已经熟悉
位掩码
我只需要知道是否有方法跟踪每个模块的权限。就像我说的,每个模块只有4个不同的权限,即使我决定以后添加更多权限,我也怀疑我会超过31个权限。不太确定您的方法将如何工作,您的意思是
角色有\u模块\u权限
将包含像id\u模块、id\u角色、权限之类的内容。模式可能看起来像id\u模块、id\u角色、id\u权限。使用您的示例,模块3在该表中有四条记录。您的主键将是id_模块和id_角色的组合。性能/可维护性方面,更好的做法是使用位掩码(数据库中的行数减少,但每页上的代码行数增加),这样每个角色将在
中有一行role_模块的权限
中,或者使用您的方式(有更多行,一个额外的表,但每页上的代码可能更少)一般来说,这可能是一个清洗。我建议每个权限一行,因为这样更符合数据库规范化的规则。
User-Add - 1
Blog-Delete - 64
  SELECT * FROM `user` 
     WHERE role & (select bit from permission where name='user-edit')