1

我试图在我的 Zend 代码中暗示一些动态断言,并且一直在使用 [Ralph Schindler][1] 的一篇文章,但我无法让它工作。我想做的是在 de Acl 中创建一个“允许”规则,检查登录的人是否实际上是一段 UserContent 的所有者。

我有一个 User 类和一个 UserContent 类(删除了所有不必要的位):

class User implements Zend_Acl_Role_Interface {
    private $_roleId;
    public function getRoleId() { return $this->_roleId; }
}

class UserContent implements Zend_Acl_Resource_Interface {
    private $_resourceId;
    private $_userId;

    public function getResourceId() { return $this->_resourceId; }
    public function getUserId() { return $this->_userId; }
}

现在在我的 Acl 类 My_Acl 中,我定义了一个“成员”角色、一个“用户内容”资源和一个“编辑”权限,并希望创建以下允许规则:

$this->allow('member', 'usercontent', 'edit', new My_Acl_Assert_IsOwner());

其中 Assert 实现了 Zend_Acl_Assert_Interface 类:

class My_Acl_Assert_IsOwner implements Zend_Acl_Assert_Interface {

    public function assert(Zend_Acl $acl, Zend_Acl_Role_Interface $role=null, Zend_Acl_Resource_Interface $resource=null, $privilege = null) {
        [return true if the user logged in is owner of the userContent]
    }
}

我仍在为在实际断言方法中放入什么而苦苦挣扎。

假设我以会员身份登录(所以我的 $_roleId='member'),并想检查是否允许我编辑一段 UserContent,如下所示:

$userContentMapper = new Application_Model_Mapper_UserContent();
$userContent = $userContentMapper->find(123);
if ($this->isAllowed($userContent, 'delete')) echo "You are allowed to delete this";

在 assert 方法中,我想放一些类似的东西:

$resource->getUserId();

但这给了我错误消息*调用未定义的方法 Zend_Acl_Resource::getUserId()*。奇怪,因为如果我测试资源是否是 UserContent 的实例,我会得到确认:将以下行添加到资产方法:

if ($resource instanceof UserContent) echo "True!";

我确实得到了一个真实的。出了什么问题?

对于测试,我在 UserContent 类中添加了一个额外的公共变量 ownerId,定义如下:

private $_id;
public $ownerId;
public function setId($id) {$this->_id = $id; $this->ownerId = $id;

现在,如果我将 $resource->ownerId 添加到 assert 方法,我不会收到任何错误消息,它只是从类中读取值。出了什么问题?$resource是UserContent的一个实例,但是不能调用getUserId方法,但是可以调用公共变量$ownerId??

[1] http://ralphschindler.com/2009/08/13/dynamic-assertions-for-zend_acl-in-zf

4

1 回答 1

1

正如@pieter 指出的那样,acl 规则在您的应用程序中的另一个位置被调用,这就是为什么当您检查资源是 UserContent 的实例时,它会回显 True。

您声明的 acl 规则正在检查“编辑”权限:

$this->allow('member', 'usercontent', 'edit', new My_Acl_Assert_IsOwner());

但是当您测试“删除”权限时:

if ($this->isAllowed($userContent, 'delete')) echo "You are allowed to delete this";

尝试将此添加到您的 acl:

$this->allow('member', 'usercontent', 'delete', new My_Acl_Assert_IsOwner());

于 2012-03-24T19:07:29.697 回答