CakePHP ACL - Как получить разрешения только для группы? - PullRequest
2 голосов
/ 23 октября 2010

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

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

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

Этот метод скажет ACL пропустить проверять пользователя Aro's и проверять только Группа Аро.

Однако, когда я добавляю группы и пользователей через запеченные контроллеры, я все равно получаю таблицу 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));
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 29 апреля 2011

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

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

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

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

Для проверки прав доступа вы можете просто использовать модель User.

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

0 голосов
/ 20 апреля 2015

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

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

0 голосов
/ 23 октября 2010

Я никогда не использовал этот метод, но концепция группы без каких-либо пользователей кажется бессмысленной. 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, я устанавливаю разрешения только по группам, и все работает нормально.

...