Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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_Authentication - Fatal编程技术网

php中的角色和权限

php中的角色和权限,php,mysql,authentication,Php,Mysql,Authentication,我正在制作一个菜单,但我想将其限制为只有一些具有特定权限的用户才能看到它 查询: 从用户权限中选择idpermission,userid,其中userid=“U001” 结果:用户U001存储了3个权限 我有3个表(用户、权限和用户权限),在用户权限中,我存储每个用户的每个权限 Example: Table user | permission | user_permissions result: user: u001,carlos,carlos@... permissions: IDP

我正在制作一个菜单,但我想将其限制为只有一些具有特定权限的用户才能看到它

查询:

从用户权限中选择idpermission,userid,其中userid=“U001”

结果:用户U001存储了3个权限

我有3个表(用户、权限和用户权限),在用户权限中,我存储每个用户的每个权限

Example:

Table

user | permission | user_permissions

result:

user: u001,carlos,carlos@...

permissions: IDP001 = book | IDP002 = create_book | IDP003 = edit_book | IDP004 = user | IDP005 = edit_user...

user_permissions:
IDP001,U001
IDP002,U001
IDP003,U001
IDP001,U002
IDP003,U002...
当我调用查询时

但在我看来,结果是3:

用户菜单用户菜单用户菜单

你应该只给我看一个,如果你有这样的权限只做比较,但什么也不显示


我想要达到的是,用户可以对菜单上的不同项目拥有许多权限,例如查看、编辑、创建、删除,每一项都是一个权限,而每一项(用户菜单、书籍菜单)都是另一个权限。

我不确定您的问题是否缺少信息,或者我可能遗漏了一点

您的示例使用U001作为用户id。
while
循环显示三个“用户菜单”回音似乎是正确的,因为U001有权查看IDP001IDP002IDP003

但是,如果您尝试查看U002,则考虑到U002没有查看IDP002IDP003的权限。你不会看到三个回声

不过,我的做法和你的略有不同。 也许这会让你的事情更简单

$userPermissions = array(
    'book'        => 1,
    'create_book' => 0,
    'edit_book'   => 0
);

$menuItems = array(
    'book' => 'View Booking',
    'create_book' => 'Create Booking',
    'edit_book' => 'Edit Booking'
);

foreach ($menuItems as $key => $value) {

    if ($userPermissions[$key]) {
        echo $value;
    }

}
在上述场景中,您可以在数据库中序列化存储
$userPermissions
。然后,一旦需要,从数据库中获取它,并使用foreach循环,通过回显
$menuItems
的值创建一个菜单(如果用户有权查看)

您的表(来自我的示例)可能如下所示:

id | user_id | permissions

使用pivot技术收集单个用户的所有权限,并形成一行以使用pdo获取

通过这种方式,所有预期的列都被声明,您可以在php中对任何权限设置使用简单的truthy/false条件检查

只要表中存在userid,就可以访问一个完全填充的行。这将是干净、直接、高效和易于维护的

架构(MySQL v5.7)


查询#1

SELECT MAX(IF(idpermission = 'IDP001', 1, 0)) AS book,
       MAX(IF(idpermission = 'IDP002', 1, 0)) AS create_book,
       MAX(IF(idpermission = 'IDP003', 1, 0)) AS edit_book,
       MAX(IF(idpermission = 'IDP004', 1, 0)) AS user,
       MAX(IF(idpermission = 'IDP005', 1, 0)) AS edit_user
FROM user_permissions
WHERE userid = 'U001'
GROUP BY userid;
结果集:

| book | create_book | edit_book | user | edit_user |
| ---- | ----------- | --------- | ---- | --------- |
| 1    | 1           | 1         | 0    | 0         |


非常感谢,我试过了,结果证明,我正在用if调节它,它运行得很好。
CREATE TABLE user_permissions ( 
  idpermission VARCHAR(20),
  userid VARCHAR(20)
);

INSERT INTO user_permissions VALUES
('IDP001', 'U001'),
('IDP002', 'U001'),
('IDP003', 'U001'),
('IDP001', 'U002'),
('IDP003', 'U002');
SELECT MAX(IF(idpermission = 'IDP001', 1, 0)) AS book,
       MAX(IF(idpermission = 'IDP002', 1, 0)) AS create_book,
       MAX(IF(idpermission = 'IDP003', 1, 0)) AS edit_book,
       MAX(IF(idpermission = 'IDP004', 1, 0)) AS user,
       MAX(IF(idpermission = 'IDP005', 1, 0)) AS edit_user
FROM user_permissions
WHERE userid = 'U001'
GROUP BY userid;
| book | create_book | edit_book | user | edit_user |
| ---- | ----------- | --------- | ---- | --------- |
| 1    | 1           | 1         | 0    | 0         |