Реализация Zend_Acl в модульном структурированном приложении с одинаковыми именами контроллеров - PullRequest
4 голосов
/ 03 января 2012

Я довольно новичок в Zend Framework. Я начал изучать это во время проекта, над которым я все еще работаю в школе. Я немного застрял в том, как справиться с ACL в сочетании с моей модульной структурой (что мне действительно нравится), и исследования в Интернете, похоже, не дали нужной мне информации. Вероятно, это потому, что я еще не очень разбираюсь в фреймворке, но я все же подумал, что могу спросить здесь. Заранее спасибо!

На данный момент, следуя большинству лучших практик, которые я исследовал, я создал модульную структуру, например:

application/
  modules/
    admin/
    default/

Я использую плагин для управления моим ACL, вот так (для простоты / читабельности я добавил только часть):

$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('guest'))
    ->addRole(new Zend_Acl_Role('member'), 'guest');
    ->addRole(new Zend_Acl_Role('admin'), 'member');
$acl->addResource(new Zend_Acl_Resource('index'));
    ->addResource(new Zend_Acl_Resource('admin:index'));
$acl->allow('guest', 'index', array('index'));
    ->allow('member', 'index', array('userpanel'));
    ->allow('admin');

В любом случае, ACL все отлично работает на модуле по умолчанию - даже на модуле администратора, но проблема возникает, когда у меня одинаковые имена и действия контроллера, например:

This action will allow users to edit their own account
Module: Default
Controller: User
Action: Edit

This action will allow an admin to edit any account
Module: Admin
Controller: User
Action: Edit

Когда я устанавливаю правило в ACL следующим образом:

$acl->allow('member', 'user', array('edit'));

Пользователю также будет разрешен доступ к странице редактирования администратора на контроллере пользователя. Как мне сообщить ACL, что между модулями есть разница? Я видел много примеров использования «admin: user» вместо «user» в качестве имени контроллера / ресурса при добавлении ресурсов в ACL. Это, кажется, не работает, когда имена контроллера и / или действия идентичны.

Итак - главный вопрос: как мне решить эту проблему в моей текущей ситуации, или как бы вы предложили мне структурировать свое приложение, чтобы избежать проблемы все вместе? Я бы предпочел не прибегать к использованию дополнительных префиксов контроллера, таких как «Admin_AdminUserController», или просто удалять все модули вместе и просто делать «adminEditAction» и т. Д.

1 Ответ

3 голосов
/ 03 января 2012

Меня также интересует, что говорят другие, но я подумал, что предложу вам одно возможное решение.

В моем текущем проекте я использую отдельный ACL для моего модуля по умолчанию (конечного пользователя) и моего модуля администратора. В дополнение к этому, для модуля администратора я расширил Zend_Auth и настроил его на использование другого пространства имен сеанса (Zend_Auth_admin), чтобы логины пользователя были полностью изолированы от логинов администратора. Человек может войти в систему как пользователь и администратор одновременно, поскольку он использует два разных пространства имен Zend_Session.

Тем не менее, у нас все еще есть роль администратора в ACL пользователя, потому что мы позволяем пользователю администратора войти в любую учетную запись пользователя из модуля администратора (никакая личная / конфиденциальная информация не является частью наших учетных записей пользователей).

В нашем случае также намного проще читать и понимать ACL, когда ACL администратора и пользователя разделены, поскольку ACL администратора имеет много правил и некоторую логику, полностью отделенную от ACL пользователя.

Это может быть, а может и не быть полезным подходом в вашем проекте, но я подумал, что выложу его в качестве возможности. Удачи!

...