Можно ли установить разрешение в zend acl на уровень действия на уровне контроллера

Я использую фреймворк zend, на моем сайте у меня есть два типа пользователей, гость и зарегистрированный пользователь, у меня есть контроллер. книги, там у меня 3 действия. добавлять, редактировать и удалять,

в моем zend acl я даю разрешения контроллеру книг только зарегистрированному пользователю, в моей навигации ссылка на книги не отображается для гостя, вместо этого я хочу показать все 3 подссылки для зарегистрированного пользователя и только добавить дополнительную ссылку для гостя

нравится

зарегистрированному пользователю

  • книги

    • добавлять

    • редактировать

    • Удалить

и гостю

  • книги

    • add

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

эта часть моего ACL

    $this->addResource(new Zend_Acl_Resource('books'));
    $this->addResource(new Zend_Acl_Resource('login'));
    $this->addResource(new Zend_Acl_Resource('logout'));        

    $this->addRole(new Zend_Acl_Role('guest'));
    $this->addRole(new Zend_Acl_Role('user'), 'guest');

    $this->allow('guest', 'login');
$this->allow('user','logout');
    $this->allow('user','books');

$this->deny('guest', 'logout');
$this->deny('user', 'login');   

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

ОБНОВИТЬ .

не запутайтесь по имени, это не zend Acl.php по умолчанию. это нестандартный остается в папке моих моделей

часть моего navigation.xml

<configdata>
    <nav>
        <books>
           <label>Books</label>
           <controller>books</controller>
           <action>index</action>
           <resource>books</resource>
           <pages>
                    <add>
                        <label>Add</label>
                        <controller>books</controller>
                        <action>add</action>
                    </add>
                    <edit>
                        <label>Edit</label>
                        <controller>books</controller>
                        <action>edit</action>
                    </edit>
                    <delete>
                        <label>Delete</label>
                        <controller>books</controller>
                        <action>delete</action>
                    </delete>
          </pages>
       </books>
   </nav>
</configdata>

person Kanishka Panamaldeniya    schedule 15.07.2011    source источник


Ответы (2)


Как уже отмечалось, вам нужно будет добавить к ресурсу привилегии. $this->allow('role','resource',array('privilege')); Многие люди используют controller как ресурс и action как привилегию.

Я предполагаю, что вы используете Zend_Navigation в сочетании с Zend_Acl, чтобы показать правильную навигацию зарегистрированным пользователям. Простая причина, по которой books и pages не отображаются, заключается в том, что вы не дали guest разрешение на просмотр родительского books. Вам нужно будет разрешить guest доступ к тем же ресурсам и привилегиям, которые определены для books. Итак, вам нужно будет сделать что-то вроде следующего:

$this->allow('guest', 'books', array('index', 'add')

Затем вы можете предоставить user доступ:

$this->allow('user', 'books', array('edit','delete')); // index & add are inherited 

Теперь в вашем Zend_Navigation_Page вам нужно будет установить ресурс как books и привилегию на index.

person brady.vitrano    schedule 15.07.2011
comment
Я добавляю это так, но теперь ссылка на книги полностью не отображается ни для гостя, ни для пользователя, вошедшего в систему - person Kanishka Panamaldeniya; 16.07.2011
comment
Можете ли вы обновить свой вопрос, указав, как вы добавляете страницу с книгами в свою навигацию? Я подозреваю, что у вас 'resource'=>'books' и отсутствует 'privilege'='index' - person brady.vitrano; 16.07.2011
comment
привет, я добавил часть моего navigation.xml. пожалуйста, проверьте это - person Kanishka Panamaldeniya; 16.07.2011
comment
Добавьте <privilege>index</privilege> под <resource>books</resource>, это должно помочь - person brady.vitrano; 16.07.2011
comment
Ага . сейчас это работает, но мне пришлось добавлять ресурсы и привилегии для каждого действия. спасибо большое: D - person Kanishka Panamaldeniya; 19.07.2011

$this->deny($this->editor,'artist',array('delete'));

где исполнитель - ресурс (контроллер), а удаление - действие.

см. http://zendguru.wordpress.com/2008/11/05/zend-framework-acl-with-example/ в качестве примера.

и / или http://framework.zend.com/manual/en/zend.acl.refining.html#zend.acl.refining.precise

person Rufinus    schedule 15.07.2011