【问题标题】:How to pass custom data to a Zend Acl custom Assertion如何将自定义数据传递给 Zend Acl 自定义断言
【发布时间】:2017-01-13 18:19:18
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: php acl zend-acl


    【解决方案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));
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-18
      • 2021-11-08
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多