簡體   English   中英

php中的角色和權限

[英]Roles and permissions in php

我正在制作菜單,但我想將其限制為只有具有特定權限的某些用戶才能看到它。

查詢:

SELECT idpermission,userid FROM user_permissions WHERE userid = "U001"

結果:用戶 U001 存儲了 3 個權限。

 idpermission,userid IDP001,U001 IDP002,U001 IDP003,U001

我有 3 個表(用戶、權限和 user_permissions) ,在user_permissions我存儲每個用戶的每個權限

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...

當我調用查詢時

while($sqlRow=$sqlPermissions->fetch(PDO::FETCH_ASSOC)) { if ($sqlRow['idpermission'] == 'IDP001' || $sqlRow['idpermission'] == 'IDP002' || $sqlRow['idpermission'] == 'IDP003') { echo "user menu "; } }

但在我看來的結果是 3:

用戶菜單用戶菜單用戶菜單

你應該只給我看一個,如果你有這樣的許可,只做一個比較顯示但什么都不顯示。

我想達到的是,用戶可以對菜單上的不同項目有很多權限,比如查看、編輯、創建、刪除,每一個都是一個權限,每個項目(用戶菜單、書籍菜單)都是另一個權限。

使用樞軸技術收集單個用戶的所有權限並形成一行以使用 pdo 獲取。

這樣,所有預期的列都會被聲明,您可以在 php 中使用簡單的真/假條件檢查來進行任何權限設置。

只要表中存在 userid,您就可以訪問一個完全填充的行。 這將是干凈、直接、高效且易於維護的。

架構 (MySQL v5.7)

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

查詢#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         |

在 DB Fiddle 上查看

我不確定您的問題是否缺少信息,或者我可能遺漏了一點。

您的示例使用U001作為用戶 ID。 while循環在顯示三個“用戶菜單”回聲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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM