当前位置:  开发笔记 > 编程语言 > 正文

设计用户角色和权限系统的最佳实践?

如何解决《设计用户角色和权限系统的最佳实践?》经验,为你挑选了4个好方法。

我需要将用户角色和权限系统添加到使用PHP/MySQL构建的Web应用程序中.我想要这个功能:

    一个root用户可以创建子根,组,规则和普通用户(所有权限).

    子根只能为他/她自己的组(没有组)创建规则,权限和用户.

    用户可以根据分配给他的权限,按组根访问由他或他的组创建的内容.

我需要系统足够灵活,以便为内容分配新的角色和权限.

我有一个users存储组密钥的表以及其他信息.目前我使用两个精密组件中的每个内容表即createdByCreatedByGroup,并使用某一个用户的点是否有权限.但它不够灵活,因为对于每一个新内容,我都必须通过所有数据更新和权限更新.请通过讨论架构设计的最佳实践来帮助我.



1> Eran Galperi..:

适合您需求的模式称为基于角色的访问控制.

PHP中有几个很好的实现,包括Zend_Acl(优秀的文档),phpGACL和TinyACL.大多数框架也以某种形式拥有自己的ACL实现.

即使您选择自己动手,也可以帮助您查看那些很好的解决方案.



2> Suresh Kamru..:

我认为按位运算符是实现用户权限的最佳方式.在这里,我将展示如何使用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'拥有'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;

样本数据-

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');

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

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://sforsuresh.in/implemention-of-user-permission-with-php-mysql-bitwise-operators/


这里没有"角色"的概念 - 你拥有的是每个用户的权限列表.

3> faulty..:

我的结构略有不同,但它应该可以作为参考.

每个用户都有一个"角色","GroupID"与其关联,以及GroupID引用的组表.然后我有3个权限表.

PermissionMaster(FormName)

PermissionChild(PermissionMasterID, PermissionName, Desc, DefaultValue, DependOn)

PermissionGroupChild(GroupID, PermissionChildID, Allow)

PermissionMaster保存权限引用的名称/表单/模块.PermissionChild将列出每个主人可用的所有可能权限,例如"创建","查看","编辑","删除"和描述(我在第一个版本上没有这个,并且它开始变得混乱即使对于1个模块,也有太多的权限设置).我允许添加更多的孩子来专门引用某些功能,如'ChangeTimeStamp',这也允许更多特定权限,然后'编辑'

然后PermissionGroupChild是PermissionChild和Group表之间的链接.每个组都将复制一组PermissionChild并使用默认设置进行设置.然后我有一个权限类,它执行表查询并检查每个用户.我只在登录时加载它.然后在每个表单/模块中,我检查它是否具有适当的权限并正确应用UI.

至于角色,我只在登录配置页面使用它.较小的角色值意味着更高的排名.因此,用户只能看到自己和角色值高于自身的用户.他/她可以编辑低于自身但不相似的那些.



4> Neil Barnwel..:

您可能不需要权限组.而是创建用户组,授予用户组权限,并将用户放入组中.用户还应该能够覆盖他们所在组的权限.拒绝应始终覆盖授权,其中用户在多个具有权限的组中.

综上所述:

用户拥有零个或多个权限(grany,deny)

用户在零个或多个组中

组具有零个或多个权限(grant,deny)

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有