首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设计用户角色和权限系统的最佳实践?

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

Stack Overflow用户
提问于 2008-12-02 10:56:04
回答 5查看 99.4K关注 0票数 53

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

  1. 一个根用户可以创建子根、组、规则和普通用户(所有权限).
  2. 子根只能为他/她自己的组(没有组)创建规则、权限和用户。
  3. 用户可以根据分配给他的权限,通过组根访问他或他的组创建的任何内容。

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

我有一个users表存储组密钥以及其他信息。目前,我在每个内容表中使用两个feilds,即createdByCreatedByGroup,并将其用作特定用户是否具有权限的问题。但是它不够灵活,因为对于每一个新的内容,我都要进行所有的数据更新和权限更新。请通过讨论您的模式设计最佳实践来帮助我。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-12-02 11:15:45

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

PHP中有几种很好的实现,包括Acl (好文档化)、phpGACLTinyACL。大多数框架也有自己的ACL的某种形式的实现。

即使你选择了自己的解决方案,它也会帮助你重新审视那些考虑因素的解决方案。

票数 39
EN

Stack Overflow用户

发布于 2014-09-03 12:09:01

我认为按位运算符是实现用户权限的最佳方法。在这里,我将展示如何使用MySQL实现它。

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

表1:存储权限名称的权限表,与其类似于1、2、4、8。等(倍数为2)

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `permission` (
  `bit` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`bit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

将一些示例数据插入到表中。

代码语言:javascript
复制
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、名称和角色的User表。角色将被计算为权限之和。

示例:

如果用户'Ketan‘拥有' user -Add’(bit=1)和'Blog-Delete‘(位-64)的权限,那么角色将是65 (1+64)。

如果用户'Mehata‘拥有'Blog-View’(bit=128)和‘user’(位-4)的权限,那么角色将是132 (128+4)。

代码语言:javascript
复制
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;

样本数据-

代码语言:javascript
复制
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');

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

代码语言:javascript
复制
SELECT permission.bit,permission.name  
   FROM user LEFT JOIN permission ON user.role & permission.bit
 WHERE user.id = 1

这里,user.role "&“permission.bit是一个按位运算符,它将输出作为-

代码语言:javascript
复制
User-Add - 1
Blog-Delete - 64

如果我们想检查某个特定用户是否拥有用户编辑权限-

代码语言:javascript
复制
  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/

票数 42
EN

Stack Overflow用户

发布于 2008-12-03 11:44:36

您可能不需要一组权限。相反,创建用户组,授予用户组权限,并将用户分组。用户还应该能够覆盖来自他们所在组的权限。当用户在多个组中时,拒绝应该始终覆盖授予。

总结如下:

  • 用户拥有零或多个权限(grany,拒绝)
  • 用户在零组或多组中。
  • 组具有零或多个权限(授予、拒绝)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/333620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档