2016-02-05 126 views
1

因此,我想要做的是讓我可以覆蓋已經在角色中作爲標準設置的權限,所以即使用戶是角色的一部分。我可以去找一個特定的用戶,並告訴他他不允許使用這個特定的權限,即使他的角色允許他做這個特定的事情,反之亦然!具有權限的角色,但也添加/刪除個人用戶的權限

在我的數據庫中,我有以下tabels。

users: 
- fk_role_id 
- ... 

permissions: 
- perm_id 
- perm_name 
- perm_key 

role_rights: 
- fk_role_id 
- fk_perm_id 

user_rights: 
- fk_usr_id 
- fk_perm_id 
- allow 

打破我的代碼下來:

所以第一和關閉我想作一個數組,在那裏我可以存儲所有我的權限。所以我可以使用if(in_array())來允許人們使用某些內容。

$g_permissions = array(); 

在這裏,我加入我的role_rights包含什麼樣的角色有哪些權限,在這裏我得到的權限與特定ID的角色包含。

$query = "SELECT * FROM role_rights 
      INNER JOIN permissions ON fk_perm_id = perm_id 
      WHERE fk_role_id = $roleID"; 
$roleArray = new DBfetch($query); 

是$ roleArray創建數組:包含它有一個讓行,要麼可以包含0或1,如果它包含0的特殊權利

role_rights - DBfetch Object 
(
    [row] => Array 
     (
      [0] => Array 
       (
        [fk_role_id] => 1 
        [fk_perm_id] => 1 
        [perm_id] => 1 
        [perm_name] => Admin Panel: Panel Access 
        [perm_key] => panel_access 
       ) 

      [1] => Array 
       (
        [fk_role_id] => 1 
        [fk_perm_id] => 2 
        [perm_id] => 2 
        [perm_name] => Admin Panel: Create a user 
        [perm_key] => panel_create_user 
       ) 

      [2] => Array 
       (
        [fk_role_id] => 1 
        [fk_perm_id] => 3 
        [perm_id] => 3 
        [perm_name] => Admin panel: Edit a user 
        [perm_key] => panel_edit_user 
       ) 

     ) 

    [num_rows] => 3 
) 

在這裏,我加入我的USER_RIGHTS它意味着它是一個應該被刪除的權限,如果它包含1,那麼它應該被添加到數組中。

$query = "SELECT * FROM user_rights 
      INNER JOIN permissions ON fk_perm_id = perm_id 
      WHERE fk_usr_id = $userID"; 
$userArray = new DBfetch($query); 

數組的$ userArray創建:

user_rights - DBfetch Object 
(
    [row] => Array 
     (
      [0] => Array 
       (
        [fk_usr_id] => 2 
        [fk_perm_id] => 3 
        [allow] => 0 
        [perm_id] => 3 
        [perm_name] => Admin panel: Edit a user 
        [perm_key] => panel_edit_user 
       ) 

      [1] => Array 
       (
        [fk_usr_id] => 2 
        [fk_perm_id] => 4 
        [allow] => 1 
        [perm_id] => 4 
        [perm_name] => Admin panel: Delete a user 
        [perm_key] => panel_delete_user 
       ) 

     ) 

    [num_rows] => 2 
) 

第一的foreach應該運行$ roleArray有牽強的一切,它給我發回的一個對象,數組我通過這個陣列運行和secound一樣。因此,如果數組發現與其他表的外鍵匹配的外鍵,那麼只要添加額外的權限或將其從數組中移除,它就會拒絕訪問。

foreach($roleArray->row as $key=>$value) { 
    foreach($userArray->row as $key2=>$value2) { 
     if($value["fk_perm_id"] == $value2["fk_perm_id"]) { 
      if($value2["allow"] == 1) { 
       $g_permissions[$value2['perm_id']] = $value2['perm_key']; 
      }else{ 
       unset($g_permissions[$value2["perm_id"]]); 
      } 
     } else { 
      $g_permissions[$value['perm_id']] = $value['perm_key']; 
     } 
    } 
} 

那麼我要求什麼,是一個解決方案。到目前爲止,還沒有,但兩個問題,我不能添加或從特定用戶刪除權限..

所有代碼:

$g_permissions = array(); 

$query = "SELECT * FROM role_rights 
      INNER JOIN permissions ON fk_perm_id = perm_id 
      WHERE fk_role_id = $roleID"; 
$roleArray = new DBfetch($query); 

$query = "SELECT * FROM user_rights 
      INNER JOIN permissions ON fk_perm_id = perm_id 
      WHERE fk_usr_id = $userID"; 
$userArray = new DBfetch($query); 

foreach($roleArray->row as $key=>$value) { 
    foreach($userArray->row as $key2=>$value2) { 
     if($value["fk_perm_id"] == $value2["fk_perm_id"]) { 
      if($value2["allow"] == 1) { 
       $g_permissions[$value2['perm_id']] = $value2['perm_key']; 
      }else{ 
       unset($g_permissions[$value2["perm_id"]]); 
      } 
     } else { 
      $g_permissions[$value['perm_id']] = $value['perm_key']; 
     } 
    } 
} 
+0

請編輯同時顯示陣列的內容的一個例子,和所需輸出 – Steve

+0

@Steve更新,我需要的一切出來! – Athax

回答

0

所以,我解決我的問題,是創建兩個處理信息的函數,並將get_usr_permissions函數輸出添加到我的數組中!

function get_permkeys_with_user_id($userID) { 

    $g_permissions = array(); 

    $query = "SELECT * FROM users 
      INNER JOIN role_rights ON users.fk_role_id = role_rights.fk_role_id 
      INNER JOIN permissions ON permissions.perm_id = role_rights.fk_perm_id 
      WHERE users.usr_id = $userID"; 

    $stuff = new DBfetch($query); 

    foreach($stuff->row as $key=>$value) { 
     $g_permissions[$value['perm_id']] = $value['perm_key']; 
    } 

    return $g_permissions; 

} 


function get_usr_permissions($userID) { 

    $runQuery = new DBhandler(); 

    $query = "SELECT * FROM user_rights 
      INNER JOIN permissions ON fk_perm_id = perm_id 
      WHERE user_rights.fk_usr_id = $userID"; 

    $perm_role = get_permkeys_with_user_id($userID); 
    $perm_usr = new DBfetch($query); 

    foreach($perm_usr->row as $index => $permission){ 
     if($permission["allow"]){ 
      $perm_role[$permission["perm_id"]] = $permission["perm_key"]; 
     }else{ 
      unset($perm_role[$permission["perm_id"]]); 
     } 
    } 

    return $perm_role; 

}