Как я могу ограничить определенный контент в CakePHP? - PullRequest
5 голосов
/ 19 марта 2011

Я довольно новичок в использовании CakePHP, но я уже нахожу невероятно полезным для быстро развивающихся веб-приложений.

Однако мне было интересно, есть ли способ ограничить доступ к определенным объектам в не-стандартный способ.Например, если бы я должен был создать единую систему CMS, позволяющую пользователям создавать «сайт», как я могу утверждать, что пользователи (кратные) имеют доступ к этому конкретному сайту?

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

, т.е. thecms.com/pages/edit/123 (как я могу быть уверен, что пользователь 9 может редактировать страницу 123, которая принадлежит сайту 2)

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

1 Ответ

5 голосов
/ 20 марта 2011

Я предполагаю, что вы уже знаете о компонентах CakePHP Auth и ACL , которые могут предоставить способы ограничения содержимого.Но также верно и то, что вы говорите: ACL в CakePHP является «специфичным для сущности» и не лучшим вариантом для каждой записи (например, пользователь 3 не должен обращаться к статье 7).Поэтому я предлагаю этот код;попробуйте и дайте мне знать:

В файле app / app_controller.php:

<?php
class AppController extends Controller {
    function checkPermission($aro, $aco, $loggedUserRole = 'User') {
        if ($loggedUserRole != 'Admin') {
            $permission = ($aro == $aco);
            if (!$permission) {
                $this->Session->setFlash('You cannot access that.');
                $this->redirect('/somewhere');
            }
        }
    }
}

Затем в действие, которое вы хотите ограничить, поместите:

$this->checkPermission($this->Auth->user('id'), $someId, $this->Auth->user('role'));

Итак, функция checkPermission () выполняет следующие действия:

При вызове вы передаете идентификатор пользователя, которого хотите авторизовать, идентификатор того, к чему пользователь пытается получить доступ, а такжероль (поэтому предполагается, что в таблице пользователей есть столбец «Роль»; также $this->Auth->user('id') означает данные сеанса пользователя, автоматически сохраняемые компонентом Auth).Затем метод checkPermission () проверяет, является ли переданная роль , а не администратором (предположим, что будут администраторы, которые будут иметь доступ ко всем), а затем проверяет равенство параметров $ aro и $ aco.Если нет, то он перенаправляется куда-то с сообщением «запрещено».

Теперь параметр $ aco может быть различным.Например, предположим, что вы создаете функцию для редактирования учетной записи пользователя, которая принимает аргумент $ userId.Таким образом, вы сравниваете идентификатор вошедшего в систему пользователя (от $this->Auth->user('id')) с переданным $ userId.Если он не равен, это означает, что зарегистрированный пользователь не должен редактировать эту запись пользователя.

Другой пример: у вас есть действие для удаления статьи, которая принимает аргумент $ articleId.Вы можете получить статью из базы данных, а затем передать значение user_id статьи в виде $ aco, до удаления статьи.Опять же, вошедший в систему пользователь будет выгнан, если такой user_id это не он.

Надеюсь, это решение вам пригодится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...