devise用户angular色和权限系统的最佳实践?
我需要将用户angular色和权限系统添加到使用PHP / MySQL构build的Web应用程序中。 我想要有这个function:
- 一个root用户可以创build子根,组,规则和普通用户(所有权限)。
- 子基础只能为他/她自己的组创build规则,权限和用户(无组)。
- 用户可以通过组根据分配给他的权限访问由他或他的组创build的内容。
我需要系统足够灵活,以便将新angular色和权限分配给内容。
我有一个users
表存储组密钥连同其他信息。 目前,我在每个内容表中使用了两个CreatedByGroup
,即CreatedByGroup
和CreatedByGroup
,并使用它作为特定用户是否具有权限的点。 但它不够灵活,因为对于每一个新的内容,我都必须通过所有的数据更新和许可更新。 请通过讨论架构devise的最佳实践来帮助我。
适合您需要的模式称为基于angular色的访问控制 。
在PHP中有几个很好的实现,包括Zend_Acl (良好的文档), phpGACL和TinyACL 。 大多数框架也以某种forms拥有自己的ACL实现。
即使你select推出自己的产品,它也会帮助你评估这些充分考虑因素的解决scheme。
我认为按位运算符是实现用户权限的最好方法。 这里我展示了如何用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,名称和angular色。 angular色将被计算为权限的总和。
例:
如果用户'Ketan'具有'User-Add'(位= 1)和'Blog-Delete'(位-64)angular色的权限将是65(1 + 64)。
如果具有'Blog-View'(位= 128)和'User-Delete'(位-4)angular色许可的用户'Mehata'将是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');
用户的授权许可login后如果要加载用户权限,可以在下面查询获得权限:
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
我有一个稍微不同的结构,但它应该能够作为参考。
每个用户都有一个“angular色”,与之关联的“GroupID”以及GroupID引用的组表。 然后我有3个权限表。
PermissionMaster(FormName)
PermissionChild(PermissionMasterID, PermissionName, Desc, DefaultValue, DependOn)
和
PermissionGroupChild(GroupID, PermissionChildID, Allow)
PermissionMaster包含权限所指的名称/表单/模块。 PermissionChild会列出每一个Master的所有可能的权限,比如'Create','View','Edit','Delete'和描述(我在第一个版本中没有这个权限,开始混淆了当即使有1个模块也有太多的权限设置)。 我允许添加更多的孩子专门引用一些function,如“ChangeTimeStamp”,这也将允许更具体的权限,然后“编辑”
然后PermissionGroupChild是PermissionChild和Group表之间的链接。 每个组将有一组PermissionChild被复制并设置为默认设置。 然后我有一个权限类,它执行表查询和检查每个用户。 我只在login时加载它。 然后在每个表单/模块中,我检查它是否适当的权限,并适当地应用UI。
至于angular色,我只在loginconfiguration页面使用它。 较小的angular色值意味着较高的排名。 所以用户只能看到自己和angular色值比自己高。 他/她可以编辑比自己更低级但不相似的人。
您可能不需要权限组。 而是创build用户组,授予用户组权限,并将用户分组。 用户还应该能够从他们所在的组中覆盖权限。拒绝应该总是覆盖授权,如果用户位于具有权限的多个组中。
综上所述:
- 用户拥有零个或多个权限(grany,deny)
- 用户在零个或多个组中
- 组拥有零个或多个权限(授予,拒绝)
我有组和用户(如活动目录LDAP解决scheme)。 因此,如果我授予访问权限,则需要该组中的用户访问权限。
所以,基于下面的@ suresh-kamrushi答案,我做了这个:
INSERT INTO `permission` (`bit`, `name`) VALUES (1, 'add-yes'), (2, 'add-no'), (4, 'edit-yes'), (8, 'edit-no'), (16, 'del-yes'), (32, 'del-no'), (64, 'view-yes'), (128, 'view-no');
如果用户有位00000000
,我将前两位数字00
,这意味着add-yes
和add-no
从组权限退回。
如果用户有位01010110
,我会先取两位数字01
,这意味着add-no
会01010110
组权限,所以这个用户没有添加权限。 这个按位说,用户只能查看。
它也正在与父母团体合作。
你对这个解决scheme有什么看法? 有没有人有更好的办法呢?