проверьте, есть ли у aro разрешение для определенного aco - PullRequest
0 голосов
/ 22 марта 2012

У меня есть настройка уровня ACL в моем приложении. Но мне нужно распечатать отчет для руководства о том, какие acos разрешены для каких aro (пользователи только в этом случае); Я просмотрел таблицы aco и таблицу aco_aro, но для меня нет никакого смысла генерировать простой отчет, к которому aco может быть получен доступ, например, с помощью aro.

Итак, как мне создать этот так называемый отчет? В настоящее время вы получаете сообщение об отказе в разрешении, если у вас нет доступа к определенным аккаунтам, но это все. Я должен был бы пойти один за другим, чтобы увидеть все это и сравнить их с пользователями, что является очень сложной ручной задачей и чрезвычайно трудным, если не невозможным! Поэтому мне было интересно, если вы, ребята, используете какой-нибудь аудит или что-то для этого.

EDIT

, поскольку никто не ответил на этот вопрос, я уточню свои требования. Как при входе в систему пользователя я могу получить то, к чему у пользователя есть разрешения? Может кто-нибудь сказать мне, как я это проверяю. спасибо

** ПОПРОБОВАЛ ЭТОТ **

 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

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Вас может заинтересовать такой компонент.Я почти уверен, что часть работы можно выполнить по-другому, но мои знания о компоненте 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 голосов
/ 12 июня 2014

Лучший и чистый подход хорошо задокументирован здесь

...