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