【问题标题】:check if the aro has permission for a certain aco检查 aro 是否有某个 aco 的权限
【发布时间】:2012-03-22 17:50:46
【问题描述】:

我的应用程序中有 ACL 层设置。但是我需要打印一份报告以供管理,哪些 acos 被哪个 aro 允许(仅在这种情况下是用户);我查看了 aco 表和 aco_aro 表,但生成一个简单的报告(例如,哪个 aco 可以通过哪个 aro 访问)对我来说没有任何意义。

那么我该如何生成所谓的报告呢?目前,如果您无权访问某些 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

【问题讨论】:

  • 试过 $this->Acl->view($id) 但这不起作用

标签: cakephp cakephp-1.3 cakephp-2.0


【解决方案1】:

您可能会对这样的组件感兴趣。我很确定部分工作可以以不同的方式完成,但我对 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。这意味着如果您将完整的 Posts 控制器的访问权限授予某人,您将只获得

allow controllers/Posts

而不是

allow controllers/Posts
allow controllers/Posts/add
allow controllers/Posts/edit
...

【讨论】:

  • 感谢您提供该组件。我在 /controllers/component/AclToolsComponent.php 下添加了这个组件,但它给了我这些错误警告 (2): call_user_func_array() 期望参数 1 是一个有效的回调,类 'AclToolsComponent' 没有方法 'startup' [ CORE/Cake/Utility/ObjectCollection.php,第 130 行]
  • 在 cakePHP 2 中,组件需要扩展 Component 而不是 Object。我想这可能是问题所在。
  • 不,我已经取出代码并直接在控制器中使用它,但它仍然给出了空数组。它对你有用吗?
  • 是的,它有效。您确定您正在处理的用户被授予或拒绝特定的 acos(我的意思是直接而不是通过他所属的组)。试试 debug($aros) 看看你得到的是否正确。
  • 将对象更改为组件更改了错误。现在它说 AclNode::node() - 找不到由“Array ([Aro0.model] )”标识的节点 Aro 节点
【解决方案2】:

最好和干净的方法有据可查here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多