CakePHP - ограничение редактирования вашими «данными» - PullRequest
4 голосов
/ 20 июля 2011

В данный момент я использую Auth Component для пользователей, чтобы войти / выйти - ACL определен для сортировки между группами пользователей (Гости, Пользователи, Администраторы) - с очевидными ограничениями;Администратор может получить доступ ко всему, пользователь может получить доступ только к редактированию в контроллере пользователей, а гость может видеть только отображение / индекс / просмотр и т. Д. И т. Д.

Теперь, чтобы запретить пользователям редактировать другого пользователяиметь функцию isOwner (), которая по сути проверяет, пытаетесь ли вы редактировать свой профиль;а также проверяет, является ли это администратором, пытающимся редактировать.Если пользователь является владельцем контента, который он пытается отредактировать, то он разрешает это, в противном случае он просто перенаправляет с помощью флеш-сообщения.

Прочитав http://book.cakephp.org/view/1245/Defining-Permissions-Cake-s-Database-ACL - я подумал, можно ли это определить в ACL?

Что-то вроде:

$this->Acl->allow(array('model' => 'User', 'foreign_key' => $id), 'Users', 'edit', $id) 

Хотя я недостаточно глубоко выкопал, и я предполагаю, что мне придется сделать что-то вроде beforeSave () с указанной выше строкой для каждого нового зарегистрированного пользователя, которому будет разрешено редактировать свой профиль.

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

[Я решил опубликовать это как ответ, потому что он содержит примеры кода]

Вы можете создать компонент (или функцию) и использовать обратный вызов beforeFilter () в app_controller, таким образом выне нужно вручную добавлять функцию ко всем контроллерам.

Также вы можете использовать несколько префиксов для действий (см. Routing.prefixes в ядре), это облегчит контроль доступа.Что-то вроде:

[app_controller.php]

function beforeFilter() {
    if(isset($this->params['prefix']) && $this->params['prefix'] == 'admin'){
         if(!isAdmin() || !isOwner())
             $this->cakeError('error404');
    }
}

[users_controller.php]

  function admin_edit($id = null){
        ... // edit as usual
    }

В стеке LAMP ваше узкое место обычно находится в базе данных

Моя проблема с тортом заключается в количестве запросов, которые он выполняет.Однажды я увидел, что моя «контактная» страница выполнила 21 запрос только для извлечения структуры данных и разрешений для этой общедоступной страницы.

Единственный способ оправдать использование ACL для доступа к данным - это когда разрешения являются динамическими, то есть " пользователь # 29 может редактировать пользователя # 12, потому что администратор решил это в бэк-офисе ",Но если у вас есть статические правила для доступа к данным (например, « пользователи могут редактировать только свою собственную информацию, а администраторы могут редактировать все »), это бесполезно для выполнения запросов, когда вы уже знаете ответы, потому что эти правила выигралине меняется во времени.

так что все зависит от вашего приложения. Наконец, еще одна мысль: если вы все еще планируете делать больше запросов = P, вы можете установить метод авторизации компонента Auth .Но использование компонента ACL для этого кажется мне плохой идеей

Cheers!

0 голосов
/ 27 марта 2014

Хорошо, это почти 4 года спустя, но для тех, кто любит меня, наткнулся на это исследование решения Acl для приложения CakePHP;Краткий ответ: да, это возможно, но это должно быть тщательно спланировано.Если вам действительно нужен этот уровень аутентификации, то на самом деле не существует жизнеспособной альтернативы реализации ACL в Cake, что, по крайней мере, звучит (не вдаваясь в критику ...).Обратите внимание, что текущая стабильная версия - 2.4:

По сути, решение состоит в том, чтобы заменить ваш isOwner() вызов в вашем коде на $dbAcl->check($user, $entity, $action);, который выполняет поиск в вашей структуре БД ACL - см. http://api.cakephp.org/2.4/class-DbAcl.html.

Это нечто большее, чем это, конечно.CakePHP не предоставляет вам готового решения для этого типа аутентификации на уровне entity .Он предоставляет вам инструментарий, который можно использовать для его создания:

  • DbAcl для запроса структуры базы данных ACL.
  • AclBehavior.Модели классов объектов, к которым вы хотите применить авторизацию на уровне объекта, должны загружать поведение Acl.Это автоматически создает и удаляет ACO / ARO на уровне объекта, заботясь обо всем, что там есть.См. http://api.cakephp.org/2.4/class-AclBehavior.html.
  • Авторизация уровня контроллера с помощью Controller :: isAuthorized ().Здесь вы позвоните dbAcl::check().См. http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#authorization. Вы также можете сделать это из пользовательского модуля Authorize, если вы действительно этого хотите.
  • Вам все еще необходимо дополнить это с помощью компонента CRUD или Action Authorize.Важно понимать, что в запеченном контроллере CakePHP по умолчанию есть 2 неявных подкласса действия / конечной точки.Те, которые воздействуют на сам Контроллер (add, index) и те, которые действуют на сущность класса объектов, представленных контроллером (edit, view, delete).Это аналогично классу против методов экземпляра.Описанный тип авторизации применим только к конечной точке, действующей на объект.В остальном вы отказываетесь от аутентификации Action / Crud.
  • Очевидно, вам понадобится модель User ..

Обратите внимание, что в конце документации по Cake есть два хороших руководства.ACL - http://book.cakephp.org/2.0/en/tutorials-and-examples. Они не охватывают этот тип установки явно, но, учитывая понимание рассматриваемых концепций плюс dBAcl, вы должны быть в состоянии сделать свой собственный путь.

...