2012-03-22 65 views
0

我在我的應用程序中設置了ACL圖層。但是我需要打印出一份管理報告,說明aro允許哪些acos(用戶僅在這種情況下)。我查看了aco表和aco_aro表,但它對我來說沒有任何意義,可以生成一個簡單的報告,例如哪個aco可以被訪問。檢查aro是否具有某個aco的權限

那麼我該如何生成這個所謂的報告呢?目前,如果您無法訪問某些acos,但您會收到權限被拒絕的消息。我將不得不一一去看所有這些,並將它們與用戶進行比較,這是非常艱鉅的手動任務,如果不是不可能的話,也非常困難!所以我想知道你們是否使用了某種審計或其他方式。

編輯

,因爲沒有人回答這個問題,我會調下來我requirements.How可根據用戶的登錄我能得到什麼ACOS的用戶有權?.有人可以告訴我如何檢查。感謝

**試過這種**

if ($this->Auth->login()) { 
      debug($this->Acl->check('User', 'Posts', $action = '*')); 

,但得到這個

Warning (512): DbAcl::check() - Failed ARO/ACO node lookup in permissions check. Node references: 
Aro: User 
Aco: Posts [CORE/Cake/Controller/Component/Acl/DbAcl.php, line 79] 
/app/Controller/UsersController.php (line 20) 
false 
+0

試圖$此 - > Acl-> view($ id),但那不起作用 – Autolycus 2012-03-22 22:42:15

回答

2

你可能有興趣通過這樣的組件。我很確定部分工作可以完成不同的工作,但我對Acl組件的瞭解還不夠。

<?php 
class AclToolsComponent extends Object { 

    var $controller = null; 
    var $components = array('Acl'); 

    function initialize(&$controller, $settings = array()) { 
     $this->controller = $controller; 
    } 

    function getUserPermissions($userId) { 
     if (!isset($this->controller->User)) { 
      $this->controller->loadModel('User'); 
     } 
     $this->controller->User->id = $userId; 
     $aro_node = $this->controller->Acl->Aro->node($this->controller->User); 
     $aliases = $this->getAcoAliases(); 
     $aros = $this->controller->Acl->Aro->find('first', array(
      'conditions' => array(
       'Aro.id' => $aro_node[0]['Aro']['id'], 
      ), 
     )); 

     $permissions = array(); 
     foreach ($aros['Aco'] as $aco) { 
      $acl_cmd = ($aco['Permission']['_create'] == 1)?'allow':'deny'; 
      $permissions[] = $acl_cmd.' '.$aliases[$aco['id']]; 
     } 

     return $permissions; 
    } 

    function getAcoAliases() { 
     $aliases = array(); 
     $acos = $this->controller->Acl->Aco->find('threaded', array(
      'contain' => array() 
     )); 

     $this->fillAliases($aliases, $acos, ''); 

     return $aliases; 
    } 

    private function fillAliases(&$aliases, $acos, $name) { 
     foreach ($acos as $aco) { 
      $sep = (!empty($name))?'/':''; 
      $new_name = $name.$sep.$aco['Aco']['alias']; 
      $aliases[$aco['Aco']['id']] = $new_name; 
      if (!empty($aco['children'])) { 
       $this->fillAliases($aliases, $aco['children'], $new_name); 
      } 
     } 
    } 
} 
?> 

從控制器,你可以再使用下面的代碼來獲得它是如何工作

$perm = $this->AclTools->getUserPermissions($userId); 
debug($perm); 

它會顯示是專門授予或拒絕用戶的ACO的想法。這意味着,如果授予訪問完整的帖子控制器給某人,你將只能得到

allow controllers/Posts 

,而不是

allow controllers/Posts 
allow controllers/Posts/add 
allow controllers/Posts/edit 
... 
+0

謝謝你的組件。我在/controllers/component/AclToolsComponent.php下添加了這個組件,但它給了我這些錯誤 警告(2):call_user_func_array()期望參數1是有效的回調,類'AclToolsComponent'沒有方法'startup'在CakePHP 2中[CORE/Cake/Utility/ObjectCollection.php,第130行] – Autolycus 2012-03-23 00:09:30

+0

,組件需要擴展Component而不是Object。我想這可能是問題所在。 – 2012-03-23 00:17:38

+0

不,我已經把代碼拿出來,直接在控制器中使用它,但它仍然給出空數組。它爲你工作? – Autolycus 2012-03-23 00:26:17

相關問題