如何将自定义数据传递给 Zend Acl 自定义断言
How to pass custom data to a Zend Acl custom Assertion
Zend Acl 文档显示了一个使用自定义断言的示例:
$acl->allow(null, null, null, new MyCustomAssertion());
问题是上面的代码是在创建规则时执行的,而不是在检查规则时执行的。在我的控制器中,我只能做类似的事情:
$acl->isAllowed('someUser', 'someResource')
与 Zend Rbac 不同,断言 class 已经实例化,我无法将用户 ID 和 post ID 传递给它来检查用户是否可以访问该 post。
检查用户是否可以使用 Zend Acl(以可维护的方式)从控制器访问 post?
注意 1:我没有为此使用 Zend 框架,只是使用 Zend Acl 组件。
注 2:我不使用 Rbac 的原因是因为我需要 Acl 具有而 Rbac 没有的 "deny" 功能。
一种方法是创建您自己的角色和资源实现:
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));
是的,这样您就可以使用上面最后一行在控制器中添加此检查。
Zend Acl 文档显示了一个使用自定义断言的示例:
$acl->allow(null, null, null, new MyCustomAssertion());
问题是上面的代码是在创建规则时执行的,而不是在检查规则时执行的。在我的控制器中,我只能做类似的事情:
$acl->isAllowed('someUser', 'someResource')
与 Zend Rbac 不同,断言 class 已经实例化,我无法将用户 ID 和 post ID 传递给它来检查用户是否可以访问该 post。
检查用户是否可以使用 Zend Acl(以可维护的方式)从控制器访问 post?
注意 1:我没有为此使用 Zend 框架,只是使用 Zend Acl 组件。 注 2:我不使用 Rbac 的原因是因为我需要 Acl 具有而 Rbac 没有的 "deny" 功能。
一种方法是创建您自己的角色和资源实现:
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));
是的,这样您就可以使用上面最后一行在控制器中添加此检查。