Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何管理数据库中的用户角色?_Php_Mysql_Database Design - Fatal编程技术网

Php 如何管理数据库中的用户角色?

Php 如何管理数据库中的用户角色?,php,mysql,database-design,Php,Mysql,Database Design,我正在创建一个网站,我将在其中管理用户及其权限。我希望实现用户角色,但似乎不知道应该如何工作。我希望能够为用户分配特定的角色,并使每个角色都包含一到多个权限,这些权限可以通过脚本轻松读取。我只是想知道我应该如何设置我的数据库来轻松高效地完成这项工作 在我的脑海中,我描绘了3个表(用户、角色和权限)。我可以给每个用户一个加入角色表的角色id,但我不知道如何将角色链接到多个权限 我只是不知道怎样才能把角色联系起来 对多个权限进行访问 您可以使用联接表:role\u id和permission\u i

我正在创建一个网站,我将在其中管理用户及其权限。我希望实现用户角色,但似乎不知道应该如何工作。我希望能够为用户分配特定的角色,并使每个角色都包含一到多个权限,这些权限可以通过脚本轻松读取。我只是想知道我应该如何设置我的数据库来轻松高效地完成这项工作

在我的脑海中,我描绘了3个表(用户、角色和权限)。我可以给每个用户一个加入角色表的角色id,但我不知道如何将角色链接到多个权限

我只是不知道怎样才能把角色联系起来 对多个权限进行访问

您可以使用联接表:role\u id和permission\u id来标识哪些权限与哪些角色关联

编辑:

示例表

角色表

Role_ID Role_Name
1       Standard User
2       Super User
3       Guest
Permission_ID Permission_Name
1             View User List
2             Update Own User Account
3             Update Any User Account
Role_ID Permission_ID
1       1    // Role 1 (Standard User) grants View User List
1       2    //        and Update Own User Account
2       1    // Role 2 (Super User) grants View User List,
2       2    //        Update Own User Account,
2       3    //        and Update Any User Account
3       1    // Role 3 (Guest) grants View User List
权限表

Role_ID Role_Name
1       Standard User
2       Super User
3       Guest
Permission_ID Permission_Name
1             View User List
2             Update Own User Account
3             Update Any User Account
Role_ID Permission_ID
1       1    // Role 1 (Standard User) grants View User List
1       2    //        and Update Own User Account
2       1    // Role 2 (Super User) grants View User List,
2       2    //        Update Own User Account,
2       3    //        and Update Any User Account
3       1    // Role 3 (Guest) grants View User List
角色权限表

Role_ID Role_Name
1       Standard User
2       Super User
3       Guest
Permission_ID Permission_Name
1             View User List
2             Update Own User Account
3             Update Any User Account
Role_ID Permission_ID
1       1    // Role 1 (Standard User) grants View User List
1       2    //        and Update Own User Account
2       1    // Role 2 (Super User) grants View User List,
2       2    //        Update Own User Account,
2       3    //        and Update Any User Account
3       1    // Role 3 (Guest) grants View User List
列出指定角色\u ID的权限

select R.role_id,
       P.permission_id,
       P.permission_name
  from role R,
       permission P,
       role_permission RP
 where RP.permission_id = P.permission_id
   and RP.role_id = R.role_id
   and R.role_id = 1 

如果您想选择这3个表,可以这样创建表:

Table       | Rows
User        | id ; name ; dob ; permission_id ; etc...  
Roles       | id ; add_post ; edit_post ; delete_post ; add_user ; etc...
Permissions | id ; user_id ; role_id 

我通常是这样做的:

您定义了一组权限,其含义因目标对象而异,但其一般含义相同。例如:

  • 阅读
  • 附加
  • 删除
  • 删除内容
  • 读取权限
  • 更改权限
然后为以下各项分配一个位:

class Perms {
    const read           = 1;
    const write          = 2;
    const append         = 4;
    const delete         = 8;
    const deleteContents = 16;
    const readPerm       = 32;
    const changePerm     = 64;
    /* shortcuts */
    const fullControl    = 127; 
    const noControl      = 0;
}
然后,对于每种类型的对象,您都有一个表,可以在其中插入对
(用户,perms)
(组,perms)
(角色,perms)
或任何您希望与权限关联的内容

您可以按如下方式查询用户的权限(可能有多个角色):

//this will depend on the database
//you could also use whatever bitwise OR aggregate your database has
//to avoid the foreach loop below
$query = new Query(
    "select perm from objects_permissions as P ".
    "where P.id_object = \$1 and " .
    "   (P.role = any(\$2));",
    $obj->getId(), $user->getRoles()
);

$perms = 0;
foreach ($query as $row) {
    $perms |= $row['perm']; 
}

您还可以轻松添加拒绝权限。

我认为按位运算符是实现用户权限的最佳方法。 这里我展示了如何用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')
输出=无行


您还可以看到:

我们使用json数据类型管理了两个表,因此不需要像


Role_ID Permission_ID
1       1    
1       2 

令人惊叹的。非常感谢你们。+1个很好的例子。我想这篇文章会被很多搜索此类信息的用户引用。谢谢@Mark,非常好的帮助。现在,假设我有一个角色平面设计师,他没有权限查看任何人的个人资料,但他自己的。我已经给他分配了一个用户来处理,他需要访问该用户的个人资料。我怎样才能在数据库中存储他有权查看分配给他的任何个人资料?@我相信上帝-这会变得更加复杂;我设置了第四个“更新托管用户帐户”权限,并创建了另一个管理者->用户关系表;将其绑定到第四次许可的安全代码中;可能会创建一个“经理”角色,并将其作为新项目的权限role@MarkBaker谢谢,这是有道理的,我想有了这个建议,我可以在manager_user表中添加第三列,如果我需要的话,它可以为项目分配经理。谢谢你的时间,你帮了我!我承认使用了类似的机制来定义用户对应用程序中对象的访问;但是一个用户/角色/权限机制类似于OP请求的访问一般UI功能(例如上传文件权限)的机制@Mark我的方法是推广。如果我需要控制上传文件的访问权限,我会定义一个“上传文件容器”,并授予用户在此类对象中的
append
权限。然后,您可以轻松添加其他相关权限,例如,容器上的
deleteContents
可以允许删除上载的文件,
read
可以允许下载文件或列出它们,等等。