Изменение представления на основе ACL в CakePHP - PullRequest
6 голосов
/ 19 июля 2010

Я хочу иметь возможность отображать или скрывать определенные элементы в представлении на основе ACL.Например, если пользователь просматривает мое представление «Пользователи / индекс», я не хочу показывать элемент «Удалить пользователя», если у него нет разрешения на удаление пользователей.Если он имеет разрешение на редактирование пользователей, я делаю хочу показать ссылку «Редактировать пользователя».

Я могу взломать это вместе, но я очень плохо знаком сТорт Я надеюсь, что есть элегантное решение.Лучшее, что я сделал, - это хранение логики в двух местах, так что поддерживать ее просто ад.

Спасибо!

Ответы [ 5 ]

4 голосов
/ 11 апреля 2012

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

В AppController :: beforeFilter вы можете назначить компонент ACL переменной представления, а затем использовать его в своем представлении:

$this->set('user', $this->Auth->user());    
$this->set('acl', $this->Acl);

И тогда, на ваш взгляд, просто используйте это как thie:

if($acl->check(array('User' => $user), 'controllers/groupd/admin_delete')) {

Это не обязательно самый правильный способ сделать это, но он работает хорошо

1 голос
/ 19 июля 2010

Я делаю это так в app_controller.php, хотя вы также можете сделать это в определенных контроллерах.Переменные представления $usersIndexAllowed и $configureAllowed затем используются в условных выражениях в представлении.

function beforeRender()
{
    if($this->layout=='admin')
    {
        $usersIndexAllowed = $this->Acl->check($user,"users/index");
        $configureAllowed = $this->Acl->check($user,"siteAdmins/configure");
    }
    $this->set(compact('usersIndexAllowed','configureAllowed'));
}
1 голос
/ 01 августа 2010

В случае, если вы не хотите возиться с переопределением основных помощников, и вам нужен более автоматический способ проверки (без жесткого кодирования имен групп пользователей и пользователей или установки отдельных переменных, специфичных для ссылок), вот мое предложение:

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

код и пример здесь

надеюсь, что поможет

1 голос
/ 19 июля 2010

Универсального «элегантного решения» не существует :) Я тоже всегда хотел сделать такое.В любом случае, как вы можете это сделать:

Перезаписать Html Helper в каталоге вашего приложения - сделайте копию из /cake/libs/views/helpers/html.php в /app/views/helpers/html.php ивнесены некоторые изменения в функцию Html :: link.

Например, вы можете проверить, содержит ли URL действие редактирования или удаления.

Другая часть заключается в передаче соответствующих параметров из контроллера.В AppController :: beforeFilter вы можете прочитать права пользователя (лучше кэшировать) и передать его в специальной переменной Auth в View.

Так что, когда у вас есть права в вашем View, это легкоизменить ссылку.:)

Как я уже сказал, я не сделал этого в реальном примере, но я бы так и сделал.

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

0 голосов
/ 17 января 2011

Существует несколько подходов к этому сценарию.Как сказал Ник, использование помощника для выполнения проверок для вас - это быстрый способ «передать» логику и централизовать ее для удобства использования.

На самом деле, посмотрите на AclLinkHelper - он делает именно то, что вы ищете, но ограничен только ссылками.

...