我的应用程序中有ACL层设置。但是我需要打印一份管理报告,说明aro允许的acos(仅在这种情况下是用户);我查看了aco表和aco_aro表,但是对我来说没有任何意义可以生成一个简单的报告,例如ao可以通过哪个来访问。
那么如何生成所谓的报告呢?目前,如果您无法访问某些特定的acos,那么您将获得权限被拒绝消息。我必须逐个去看所有这些并将它们与用户进行比较,这是非常艰巨的手动任务,即使不是不可能也是非常困难的!所以我想知道你们是否使用了一些审计或其他东西。
修改
因为没有人回答这个问题,我会调低我的要求。用户登录后如何才能获得用户有权使用的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 :(得分: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
...
答案 1 :(得分:0)
最好和最简洁的方法有详细记录here