zend acl多个访问列表/级别

时间:2011-01-04 09:58:55

标签: zend-framework zend-auth zend-acl

我正在构建一个用户和公司可以加入的门户网站。用户可以是独立的,也可以在公司下工作。所有用户都可以使用一些基本访问权限,无论其类型如何(独立或与公司相关联)。还有一些功能可供独立用户使用,但如果用户在公司下,公司经理将能够允许/禁止他们访问特定功能。如何使用Zend_Acl管理它?

1 个答案:

答案 0 :(得分:1)

你的ACL可以有条件。

在我声明我的ACL(顺便说一下插件)的文件中,我有以下声明。 Acl_AdminCanAccessUsersZend_Acl_Assert_Interface,将返回 TRUE FALSE 。在这里,我也将Request Object传递给构造函数。

    // Complex function to see if the current user can create/edit the desired user account.
    $acl->allow('client', 'user', array('edit','create'), new Acl_AdminCanAccessUsers($this->_request));

现在让我们来看看Acl_AdminCanAccessUsers

<?php

class Acl_AdminCanAccessUsers implements Zend_Acl_Assert_Interface
{

public function  __construct($request) {
    $this->request = $request;
}

public function  assert(Zend_Acl $acl,
                        Zend_Acl_Role_Interface $role = null,
                        Zend_Acl_Resource_Interface $resource = null,
                        $privilege = null)
{

    /**
     * Can only test when trying to edit a user account
     */
    if ("edit" != $privilege) {
        return TRUE;
    }

    $identity = Zend_Auth::getInstance()->getIdentity();

    /**
     * Get the id from the URL request
     */
    $id = $this->request->getParam('id');

    /**
     * Get user account from DB
     */
    $user = Doctrine_Core::getTable('User')->find($id);

    // Are they editing their own account? Give them a pass
    if ($identity->user_id == $user->user_id) {
        return TRUE;
    }

    // If they don't have the isAdmin flag set to yes on their account
    // Then we'll just deny them immediately
    if ($identity->isAdmin) {
         return TRUE;
    }

    return FALSE;
}
}

正如您在此处所看到的,我们正在检查数据库中的用户记录,并将其与请求的参数进行比较,或者检查它们是否在Zend_Auth标识中设置了isAdmin标志。如果访问的内容多于角色,资源和权限,则可以对ACL进行大量条件检查。

快乐的编码!