CakePHP ACL - Как получить разрешения только для группы?

Мне просто нужны разрешения только для группы - мне не нужны разрешения на основе пользователей. В руководстве по Cake 1.3 (http://book.cakephp.org/view/1646/x11-2-4-1-Group-only-ACL) говорится:

Если нам нужны упрощенные разрешения для каждой группы, нам нужно реализовать bindNode () в модели User.

function bindNode($user) {
    return array('Group' => array('id' => $user['User']['group_id']));
}

Этот метод скажет ACL пропустить проверку User Aro и проверять только Group Aro.

Однако, когда я добавляю группы и пользователей через запеченные контроллеры, я все равно получаю таблицу ARO с вложенными группами / пользователями для пользовательских разрешений. Я ожидал, что таблица ARO будет выглядеть так (потому что в руководстве написано, как она будет выглядеть):

+----+-----------+-------+-------------+-------+------+------+
| id | parent_id | model | foreign_key | alias | lft  | rght |
+----+-----------+-------+-------------+-------+------+------+
|  1 |      NULL | Group |           1 | NULL  |    1 |    2 |
|  2 |      NULL | Group |           2 | NULL  |    3 |    4 |
|  3 |      NULL | Group |           3 | NULL  |    5 |    6 |
+----+-----------+-------+-------------+-------+------+------+

Но вместо этого выглядит так:

+----+-----------+-------+-------------+-------+------+------+
| id | parent_id | model | foreign_key | alias | lft  | rght |
+----+-----------+-------+-------------+-------+------+------+
|  1 |      NULL | Group |           1 | NULL  |    1 |    4 |
|  2 |      NULL | Group |           2 | NULL  |    5 |    8 |
|  3 |      NULL | Group |           3 | NULL  |    9 |   12 |
|  4 |         1 | User  |           1 | NULL  |    2 |    3 |
|  5 |         2 | User  |           2 | NULL  |    6 |    7 |
|  6 |         3 | User  |           3 | NULL  |   10 |   11 |
+----+-----------+-------+-------------+-------+------+------+

Вот моя модель пользователя:

class User extends AppModel {
    var $name = 'User';

    var $actsAs = array('Acl' => array('type' => 'requester'));

    var $hasMany = array(
        'Post' => array(
            'className' => 'Post',
            'foreignKey' => 'user_id'
        )
    );
    var $belongsTo = array(
        'Group' => array(
            'className' => 'Group',
            'foreignKey' => 'group_id'
        )
    );

    /**
     *
     * In case we want simplified per-group only permissions
     * see http://book.cakephp.org/view/1547/Acts-As-a-Requester
     * @param unknown_type $user
     */
    function bindNode($user) {
        return array('Group' => array('id' => $user['User']['group_id']));
    }

    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));
        }
    }
}

person Owen    schedule 23.10.2010    source источник


Ответы (3)


Что ж. Я предполагаю, что у вас также есть модель / таблица групп, которая также содержит

var $actsAs = array('Acl' => array('type' => 'requester'));

Это причина, по которой ваша таблица ARO содержит оба экземпляра. Привязка позволяет вам изменить узел дерева ARO, которому назначена конкретная модель. Решение, описанное в документации, означает, что если вы проверите свою модель с помощью ACL->check(), тогда она будет использовать только что привязанный узел ARO.

Вы также назначаете идентификатор группы в родительском узле для модели User, то есть ваше дерево ARO построено таким, как оно есть. Я предполагаю, что для реализации вашего решения просто удалите объявления acts_as и parent_node в вашей пользовательской модели.

Чтобы проверить права доступа, вы можете просто использовать свою User модель.

Надеюсь, это немного проясняет ситуацию. Я только начал увлекаться ACL, так что, возможно, я что-то неправильно понял в поведении bind. Вы можете увидеть, поможет ли это.

person Christian F    schedule 29.04.2011

Проблема в том, что вы все еще храните старую информацию в базе данных.

Если вы очистите все таблицы, включая aros, acos и aros_acos, и снова добавите создание групп и пользователей, вы получите документированный результат.

person Rui Cardoso    schedule 20.04.2015

Я никогда не использовал этот метод, но концепция группы без пользователей кажется бессмысленной. Cake использует информацию о пользователях и группах, чтобы решить, кто к какой группе принадлежит, чтобы применить соответствующие разрешения группы.

Однако, глядя на "Книгу", ваши пользователи должны иметь установленный group_id:

«Каждому пользователю должен быть назначен group_id, чтобы это работало».

CREATE TABLE users (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    password CHAR(40) NOT NULL,
    group_id INT(11) NOT NULL,
    created DATETIME,
    modified DATETIME
);

В моих приложениях, которые не используют bindNode, я устанавливаю разрешения только по группам, и все работает нормально.

person Leo    schedule 23.10.2010
comment
Да, каждому пользователю должен быть назначен group_id, чтобы это работало - так почему же книга показывает результирующую таблицу ARO с ТОЛЬКО группами в ней? - person Owen; 23.10.2010
comment
Я не знаю на это ответа. Это вариант, о котором я не знал, и, возможно, книга верна, а ваша реализация - нет. Я считаю, что использование bindNode изменяет логику, а не модель, поэтому ваша реализация верна, а книга ошибочна. Это хорошо, но редактировать может любой желающий. На днях я заметил, что часть контейнера «Контейнер» исчезла. А может, его никогда не было! - person Leo; 24.10.2010
comment
Чем больше я использую CakePHP, тем больше мне он нравится, но часто приходилось очень много работать с документацией :) - person Owen; 24.10.2010