为Zend Navigation Pages提供多个ACL权限

时间:2010-03-15 16:49:59

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

我正在使用Zend_Navigation并尝试将其与Zend_Acl集成。导航中的每个页面都有privilege属性。我无法确定的是如何为单个页面定义多个权限。

用例:用于管理用户的页面。如果当前登录的用户角色在add资源上拥有editdeleteUsers权限,我想显示该页面(在导航中)。

导航XML中的示例条目:

<admin_users>
    <label>Users</label>
    <route>default</route>
    <controller>admin</controller>
    <action>users</action>
    <resource>Users</resource>
    <privilege>add,edit,delete</privilege>
</admin_users>

使用上面以逗号分隔的列表不会产生所需的行为。


更新

在深入研究代码之后,我发现Zend_Navigation_Page只允许单个字符串值。有没有人扩展这个课程或找到另一种解决这个限制的方法?

/**
 * Sets ACL privilege associated with this page
 *
 * @param  string|null $privilege  [optional] ACL privilege to associate
 *                                 with this page. Default is null, which
 *                                 sets no privilege.
 * @return Zend_Navigation_Page    fluent interface, returns self
 */
public function setPrivilege($privilege = null)
{
    $this->_privilege = is_string($privilege) ? $privilege : null;
    return $this;
}

3 个答案:

答案 0 :(得分:2)

我意识到我的问题是我缺乏“查看”类型权限。当我加载资源权限时,如果用户具有该资源的任何权限,我现在授予资源“admin”权限。然后我在页面上使用'admin'权限。

<admin_users>
    <label>Users</label>
    <route>default</route>
    <controller>admin</controller>
    <action>users</action>
    <resource>Users</resource>
    <privilege>admin</privilege>
</admin_users>

答案 1 :(得分:0)

将数据权限作为数组传递可能需要某种嵌套:

<admin_users>
    <label>Users</label>
    <route>default</route>
    <controller>admin</controller>
    <action>users</action>
    <resource>Users</resource>
    <privilege>
        <add>add</add>
        <edit>edit</edit>
    </privilege>
</admin_users>

编辑:

常识告诉一个链接应该指向一个动作。您可以在菜单中添加<params>个节点。

<admin_users_edit>
    <label>Users edit</label>
    <route>default</route>
    <controller>admin</controller>
    <action>users</action>
    <resource>Users</resource>
    <params>
       <do>edit</do>
    </params>
    <privilege>
        <edit>edit</edit>
    </privilege>
</admin_users_edit>


<admin_users_delete>
    <label>Users delete</label>
    <route>default</route>
    <controller>admin</controller>
    <action>users</action>
    <resource>Users</resource>
    <params>
       <do>delete</do>
    </params>
    <privilege>
        <edit>delete</edit>
    </privilege>
</admin_users_delete>

答案 2 :(得分:-2)

您是否尝试过以下操作?我不确定它是否会起作用,但我有一种感觉。

<admin_users>
<label>Users</label>
<route>default</route>
<controller>admin</controller>
<action>users</action>
<resource>Users</resource>
<privilege>add</privilege>
<privilege>edit</privilege>
<privilege>delete</privilege>