是否可以将zend acl中的权限设置为动作级别而不是控制器级别

时间:2011-07-15 12:42:56

标签: zend-framework zend-navigation zend-acl php

我正在使用zend框架,在我的网站中我有两种类型的用户,guest和loggeduser,我有一个名为的控制器。书籍,在那里我有3个动作。添加,编辑和删除

在我的zend acl中我只将书籍控制器的权限授予登录用户,在我的导航中,书籍链接未显示给访客,而不是我想向所记录的用户显示所有3个子链接,并且只添加子链接到访客

像这样

加入用户

    • 添加

    • 修改

    • 删除

和访客

    • 添加

问题是当我在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>

2 个答案:

答案 0 :(得分:3)

如前所述,您必须为资源添加权限。 $this->allow('role','resource',array('privilege'));许多人使用controller作为资源,action作为权限。

我假设您将Zend_NavigationZend_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

答案 1 :(得分:1)

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

其中artist是资源(控制器),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