Реализация Zend Acl в модульном структурированном приложении с идентичными именами контроллеров


Я довольно новичок в 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');

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

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_adminusercontroller", или просто удалите все модули вместе и просто сделайте "admineditaction" и т. Д.

Author: Ivo Coumans, 2012-01-03

1 answers

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

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

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

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

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

 3
Author: drew010, 2012-01-03 16:36:48