2010-07-19 1 views
6

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

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

Спасибо!

ответ

1

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

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

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

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

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

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

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

1

Я делаю это так в 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

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

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

код и пример here

надежда, что помогает

0

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

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

4

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

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

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

А потом в вас просмотреть только Juse его, как этой одной:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^