Как передать пользовательские данные в пользовательское утверждение Zend Acl

Документы Zend Acl показывают пример использования пользовательского утверждения:

$acl->allow(null, null, null, new MyCustomAssertion());

Проблема в том, что приведенный выше код выполняется при создании правил, а не при их проверке. В моем контроллере я могу сделать только что-то вроде:

 $acl->isAllowed('someUser', 'someResource')

В отличие от Zend Rbac, класс утверждений уже создан, и я не могу передать ему идентификатор пользователя и идентификатор сообщения, чтобы проверить, имеет ли пользователь, в частности, доступ к этому сообщению.

Можно ли проверить (есть ли у пользователя доступ к сообщению с контроллера) с помощью Zend Acl (поддерживаемым способом)?

Примечание 1: я не использую Zend Framework для этого, просто компонент Zend Acl.
Примечание 2: Причина, по которой я не использую Rbac, заключается в том, что мне нужна функция «отрицать», которая есть в Acl, а в Rbac нет.

1

Решение

Один из способов — создать собственную реализацию роли и ресурса:

class MyCustomAssertion implements Zend\Permissions\Acl\Assertion\AssertionInterface
{
public function assert(Zend\Permissions\Acl\Acl $acl,
Zend\Permissions\Acl\Role\RoleInterface $role = null,
Zend\Permissions\Acl\Resource\ResourceInterface $resource = null,
$privilege = null)
{
if(is_a($role, UserRole::class) && is_a($resource, PostResource::class)) {
$post_id = $resource->getResourceId();
$user_id = $role->getId();
// find out if the user has access to this post id(eg with a database query)
// return true or false.
return true;
}

return true;
}

}

class PostResource implements Zend\Permissions\Acl\Resource\ResourceInterface
{
private $post_id;

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

public function getId()
{
return$this->post_id;
}
public function getResourceId()
{
return 'post';
}
}

class UserRole implements Zend\Permissions\Acl\Role\RoleInterface
{

private $id;

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

public function getId()
{
return $this->id;
}
public function getRoleId()
{
return 'user';
}
}use Zend\Permissions\Acl\Acl;
use Zend\Permissions\Acl\Role\GenericRole as Role;
use Zend\Permissions\Acl\Resource\GenericResource as Resource;

$acl = new Acl();

$acl->addRole(new Role('user'));

$acl->addResource(new Resource('post'));

$acl->allow(null, null, null, new MyCustomAssertion());

// lets check if user with id 11 has access to post with id 5.
$acl->isAllowed(new UserRole(11), new PostResource(5));

Да, таким образом вы можете добавить эту проверку в контроллере, используя последнюю строку выше.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]