Как настроить ресурс ACL для конкретного модуля?

Zend Acl позволяет создавать ресурсы только в контроллере

Но контроллеры могут быть в любом модуле, а не только в модуле по умолчанию. Итак, я прочитал какую-то статью в Интернете, я нашел одну и попробовал это:

$acl -> addResource(new Zend_Acl_Resource("admin"));
$acl -> addResource(new Zend_Acl_Resource("admin:page"), "admin");
$acl -> addResource(new Zend_Acl_Resource("admin:posts"), "admin");

Но, тем не менее, когда я просматриваю соответствующие страницы, я получаю ошибки, касающиеся ресурса page не найден, или posts не найден.

Как настроить ресурс ACL для конкретного модуля?

Обновлять:

$acl -> addrole(new Zend_Acl_Role('guest'))
    -> addrole(new Zend_Acl_ROle('admin'), 'admin');

$acl -> addResource(new Zend_Acl_Resource("page")); //controller with same name in admin module exists

$acl -> addResource(new Zend_Acl_Resource("admin"));
$acl -> addResource(new Zend_Acl_Resource("admin:page"), "admin");
$acl -> addResource(new Zend_Acl_Resource("admin:posts"), "admin");

$acl -> deny(null, null);
$acl -> allow('user', 'page', 'view');
$acl -> allow('admin', null);

person mrN    schedule 21.08.2011    source источник
comment
Код, представленный здесь, правильный. Вы получаете ошибку откуда-то еще; где бы вы ни находились, вы можете проверить, может ли текущая роль получить доступ к ресурсу page (вместо этого следует проверить admin:page). Скорее всего, ваша ошибка связана с тем, что вы добавляете разрешения (allow или deny) к ролям.   -  person adlawson    schedule 21.08.2011
comment
@adlawson, я боюсь, что это не относится к роли, потому что есть только два типа ошибок: гость и администратор, а администратору разрешено все, используя $acl -> allow("admin", null);   -  person mrN    schedule 21.08.2011
comment
В этом случае вам нужно опубликовать больше кода. Ошибка отсутствует в приведенном выше фрагменте.   -  person adlawson    schedule 21.08.2011
comment
@adlawson, ок, загляни в раздел обновлений   -  person mrN    schedule 21.08.2011


Ответы (1)


Я предполагаю, что опубликованный вами код был своего рода псевдокодом, поскольку он недействителен. Тем не менее, этот ответ должен работать отлично, как есть.

$acl->addrole(new Zend_Acl_Role('guest'))
    ->addrole(new Zend_Acl_Role('admin'), 'guest');

$acl->addResource(new Zend_Acl_Resource("page"));
$acl->addResource(new Zend_Acl_Resource("admin"));
$acl->addResource(new Zend_Acl_Resource("admin:page"), "admin");
$acl->addResource(new Zend_Acl_Resource("admin:posts"), "admin");

$acl->deny();
$acl->allow('guest', 'page', 'view');
$acl->allow('admin');

// Lets run some quick tests...
var_dump($acl->isAllowed('guest', 'page', 'view')); // true
var_dump($acl->isAllowed('guest', 'page', 'edit')); // false
var_dump($acl->isAllowed('guest', 'admin:page', 'view')); // false

var_dump($acl->isAllowed('admin', 'page', 'view')); // true
var_dump($acl->isAllowed('admin', 'page', 'edit')); // false
var_dump($acl->isAllowed('admin', 'admin:page', 'view')); // true
person adlawson    schedule 21.08.2011
comment
Почему, когда я комментирую строку $acl->addResource(new Zend_Acl_Resource("page")); и просматриваю /admin/page, в ней говорится, что ресурс page не может быть найден. admin:page не будет определять страницу как ресурс внутри администратора. - person mrN; 21.08.2011
comment
Нет. Используемое имя ресурса - это точное имя, которое вы ему дали. Так что для admin:page вы должны использовать это именно так. Вызов дочернего ресурса admin:page - это соглашение об именах. Вы могли бы назвать его my_ToTaLlY::unique-resourceName, если бы захотели, но с тех пор вы должны использовать его именно так. - person adlawson; 21.08.2011
comment
Затем, как я смогу различать ресурс страницы модуля по умолчанию и ресурс страницы модуля администратора. - person mrN; 21.08.2011
comment
Вы уже на полпути. У вас есть admin:page. Теперь вам нужно default:page. Вот и все. Два совершенно разных названия ресурса. - person adlawson; 21.08.2011
comment
В вашем примере к какому ресурсу будет обращаться $acl->allow('guest', 'page', 'view');. Я попробовал ваш путь по умолчанию: и admin: и разрешил гость, к контроллеру индекса контроллера индекса модуля администратора, $acl -> allowed('guest', 'admin:index');, но все же гость может просматривать / страницу администратора - person mrN; 21.08.2011
comment
$acl->allow('guest', 'page', 'view'); вообще не будет работать, если вы не определите ресурс под названием page. Не должно. Не будет. Не может. Это не волшебство. - person adlawson; 21.08.2011
comment
Я попробовал ваш путь по умолчанию: и admin: и разрешил гостя, к контроллеру индекса контроллера индекса модуля администратора, $ acl - ›allowed ('гость', 'admin: index'); но я все еще не могу его просмотреть. Почему? (извините, последний комментарий был отменен) - person mrN; 21.08.2011
comment
@mrN позвольте нам продолжить обсуждение в чате - person adlawson; 21.08.2011
comment
+1, и примите, это меньшее, что я могу сделать, чтобы выручить меня, большое вам спасибо - person mrN; 21.08.2011