ACL группы с подгруппами - PullRequest
       23

ACL группы с подгруппами

0 голосов
/ 21 апреля 2011

У меня есть рабочие группы ACL
-client<br> -member<br> -manager

и нужно поместить их во ВСЕ группы как подгруппы
ALL<br> -client<br> -member<br> -manager

чтобы добавить разрешения для ВСЕХ, так что 3 других наследуют его,
Как правильно это сделать?

1 Ответ

0 голосов
/ 25 апреля 2011

Я предполагаю, что у вас есть необходимые модели пользователей и групп, и вы собираетесь использовать поведение ACL в CakePHP.Я также предполагаю, что у вас есть таблицы «acos», «aros» и «aros_acos».

Вам нужно сделать свои группы типом дерева:

class Groups extends AppModel {
    var $actsAs = array('Tree', 'Acl' => array('type' => 'requester'));

    function parentNode() {
        return null;
    }

}

и в MySQL,Ваша групповая таблица должна иметь эти поля - id, parent_id, lft, rght, name (или description).Первые четыре поля необходимы для работы поведения дерева.

В groups_controller.php:

function add($parentId = null){
    if(!empty($this->data)){
        if($this->Group->save($this->data)) {
            $this->Session->setFlash(__('The group has been saved.', true));
            $this->redirect(array('action'=>'index'));
        } else {
            $this->Session->setFlash(__('The group could not be saved. Please try again.', true));
        }
    }
    $this->set(compact('parentId'));
}

В пользовательской модели:

class User extends AppModel {

var $name = 'User';
var $belongsTo = array('Group');
var $actsAs = array('Acl' => array('type' => 'requester'));

function parentNode() {
    if (!$this->id && empty($this->data)) {
        return null;
    }
    if (isset($this->data['User']['group_id'])) {
    $groupId = $this->data['User']['group_id'];
    } else {
        $groupId = $this->field('group_id');
    }
    if (!$groupId) {
    return null;
    } else {
        return array('Group' => array('id' => $groupId));
    }
}


}

Теперь каждый разПри добавлении новой группы или пользователя таблица AROS автоматически обновляется.Затем вам нужно установить разрешения для каждого узла в таблице AROS_ACOS.К сожалению, в CakePHP нет простого способа сделать это.

Вы можете поместить этот код в groups_controller.php и затем запускать / groups / build_acl каждый раз, когда добавляете / удаляете пользователей / группы:

function initDB() {
    $group =& $this->User->Group;
    //Allow ALL to everything
    $group->id = 1;     
    $this->Acl->allow($group, 'controllers');

    //allow managers to posts and widgets
    $group->id = 2;
    $this->Acl->deny($group, 'controllers');
    $this->Acl->allow($group, 'controllers/Posts');
    $this->Acl->allow($group, 'controllers/Widgets');

    //allow client to only add and edit on posts and widgets
    $group->id = 3;
    $this->Acl->deny($group, 'controllers');        
    $this->Acl->allow($group, 'controllers/Posts/add');
    $this->Acl->allow($group, 'controllers/Posts/edit');        
    $this->Acl->allow($group, 'controllers/Widgets/add');
    $this->Acl->allow($group, 'controllers/Widgets/edit');
    //we add an exit to avoid an ugly "missing views" error message
    echo "all done";
    exit;
}

Надеюсь, это поможет.Большинство кодов были взяты из онлайн-документации CakePHP.

...