2012-03-22 42 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

相关问题