Пользовательские динамические разрешения с Zend_ACL

Можно ли назначать пользователям индивидуальные разрешения на основе динамических элементов в приложении Zend Framework?

У меня есть такие таблицы:

clients (id, name, contact_name, contact_number, logo, active)
modules (id, client_id, module_id, active)
permissions (id, user_id, client_id, module_id)
users (id, username, password, email, realname)

Что мне нужно сделать, так это разрешить конкретному пользователю получить доступ к определенному модулю для каждого отдельного клиента, но я не могу найти никакого способа заставить Zend_ACL сделать это. Что было бы наиболее эффективным способом сделать это?

Изменить: извиняюсь, я забыл добавить деталь. Я должен разрешить администратору предоставлять и отзывать разрешения у пользователей в интерфейсе администрирования.


person Ben    schedule 13.08.2010    source источник
comment
Да, конечно, возможно. Zend_Acl очень гибкий. Вы можете получить роли и разрешения пользователей из базы данных, файла xml или чего угодно еще. Вы даже можете жестко их запрограммировать, но это не очень часто.   -  person Richard Knop    schedule 02.02.2011


Ответы (3)


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

http://codeutopia.net/blog/2009/02/18/zend_acl-part-3-creating-and-storing-dynamic-acls/

person jsuggs    schedule 02.02.2011

Давайте снова откроем эту тему, хорошо, что ее закончить, и это довольно сложно в реализации. Давайте разберемся в проблеме, которая у нас есть: Бен: Я не знаю, что происходит в вашем проекте, но давайте создадим аналогичный сценарий. У нас есть веб-сайт для гостей, клиентов и администраторов: нам нужна таблица в нашей базе данных, чтобы сохраните имена ролей, и для каждой роли у нее есть свои разрешения

Roles (idRole, nameRole)
Permissions (We will speak about it later)

Скажем, может быть позже нам нужно будет установить больше ролей для нашего приложения, поэтому мы настроим страницу для администратора, чтобы назначить разрешения для каждой роли (например, Drupal и Joomla), одно из решений - найти все модули которые у вас есть в вашем приложении, затем получите контроллеры для каждого модуля и действия для каждого контроллера. а затем мы должны указать Zend_Acl установить наши роли из таблицы ролей в базе данных, а ресурсы - это модули Zend-> Действия для каждого контроллера. Итак, нам понадобится таблица для хранения всех модулей, и для каждого модуля нам потребуются контроллеры и действия.

Modules (idModule, nameModule)
Controllers (idController, nameController, idModule_FK)
Actions (idAction, nameAction, descriptionAction, idController_FK)

Поле описания получит его из примера описания действия.

/**
* @description := Action to edit Roles
**/
public function editAction {}

Итак, теперь давайте завершим структуру нашей базы данных

Roles (idRole, nameRole)
Permission (idRole, allowedPermission, idAction, dateTimeAssigned)
Modules (idModule, nameModule)
Controllers (idController, nameController, idModule_FK)
Actions (idAction, nameAction, descriptionAction, idController_FK)

Вот общая структура, которую я мог найти до сих пор, я пытаюсь вернуть все модули / контроллеры / действия, когда это будет сделано, я отправлю его сюда (класс плагина), тогда мы попытаемся переместить все вместе (участие других), чтобы решить этот вопрос с помощью Zend_Acl Dynamic.

Следующие шаги: чтобы создать подключаемый модуль в Library/App/Action/Helper, если это делает кто-то, пожалуйста, отправьте ответ, чтобы высказать общее мнение об этом. Затем мы сосредоточимся на сохранении данных с помощью Doctrine ORM с нашим проектом Zend. 3-й шаг - создать контроллер. который динамически создает Zend_Acl из информации базы данных (Роль, Разрешения, Действия).

Любые советы / идеи / предложения, здесь следует продолжить, пока не будет закончено.

С уважением,

person Dr.SoFtNaF    schedule 02.02.2011
comment
Честно говоря, не могу сказать, ответ это или вопрос. - person LittleBobbyTables - Au Revoir; 30.11.2012

Базовая структура ACL может быть, например, такой

$acl = new Zend_Acl();

// allow user with ID 1 access reports section for client with ID 4
$acl->allow(
  new Zend_Acl_Role('user_1'),
  new Zend_Acl_Resource('reports'),
  'client_4'
);

// allow administrator access reports module for all clients
$acl->allow(
  new Zend_Acl_Role('administrator'),
  'reports'
);

И так далее ...
Все зависит от вас, какой стиль вы предпочитаете. Zend_Acl очень гибкий, и я согласен, что руководство можно было бы написать с большим количеством примеров и передовых методов, но, в конце концов, не так уж и сложно разобраться в этом самостоятельно.

person mike    schedule 14.08.2010
comment
Есть ли способ загрузить это из бэкэнда MySQL (или модели)? - person Ben; 14.08.2010
comment
Поскольку логика ACL отличается от приложения к приложению, Zend_Acl напрямую не поддерживает загрузку данных из базы данных. Вы должны сделать это в 2 шага - а) загрузить данные из db; б) проанализируйте данные и заполните Zend_Acl. Однако это не ошибка. - person mike; 14.08.2010