如何将自定义数据传递给 Zend Acl 自定义断言



Zend Acl 文档展示了一个使用自定义断言的示例:

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

问题是上面的代码是在创建规则时执行的,而不是在检查规则时执行的。在我的控制器中,我只能执行以下操作:

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

与 Zend Rbac 不同,断言类已经实例化,我无法向它传递用户 ID 和帖子 ID 来检查用户是否有权访问该帖子。

检查用户是否可以使用 Zend Acl 访问来自控制器的帖子(以可维护的方式)实现?

注意 1:我没有为此使用 Zend 框架,只是使用 Zend Acl 组件。注意2:我不使用Bbac的原因是我需要ACL具有而Robac没有的"拒绝"功能。

一种方法是创建自己的角色和资源实现:

class MyCustomAssertion implements ZendPermissionsAclAssertionAssertionInterface
{
    public function assert(ZendPermissionsAclAcl $acl,
        ZendPermissionsAclRoleRoleInterface $role = null,
        ZendPermissionsAclResourceResourceInterface $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 ZendPermissionsAclResourceResourceInterface
{
    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 ZendPermissionsAclRoleRoleInterface
{
    private $id;
    public function __construct($id)
    {
        $this->id = $id;
    }
    public function getId()
    {
        return $this->id;
    }
    public function getRoleId()
    {
        return 'user';
    }
}

use ZendPermissionsAclAcl;
use ZendPermissionsAclRoleGenericRole as Role;
use ZendPermissionsAclResourceGenericResource 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));

是的,这样您就可以使用上面的最后一行将此检查添加到控制器中。

相关内容

  • 没有找到相关文章

最新更新