Zend_Acl и динамический Assert - PullRequest
1 голос
/ 30 января 2012

Я пытаюсь включить некоторые динамические утверждения в мой 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 я определил роль 'member', ресурс 'usercontent' и привилегию 'edit', и хотел бы создать следующее правило разрешения:

$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]
    }
}

, где я все еще борюсь с тем, что добавить в метод assert.

Допустим, я вошел как участник (поэтому мой $ _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!";

Я действительно получаю истинное значение.Что идет не так?

Для теста я добавил дополнительную открытую переменную ownerId в класс UserContent, который определяется следующим образом:

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

1 Ответ

1 голос
/ 24 марта 2012

Как указал @pieter, правило acl вызывается в другом месте вашего приложения, поэтому, когда вы проверяете, что ресурс является экземпляром UserContent, он отображает True.

Правило acl, которое вы объявляете, проверяет привилегию "edit":

$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());

...