Zend ACL在非现有资源上抛出异常

时间:2014-01-04 00:12:17

标签: zend-framework2 acl

我正在尝试启动和运行Zend ACL,但我似乎遇到了以下问题:

PHP Fatal error:  Uncaught exception 'Zend\Permissions\Acl\Exception\InvalidArgumentException' with message 'Resource 'article-2' not found' in vendor/zendframework/zend-permissions-acl/Zend/Permissions/Acl/Acl.php:292

我得到的结论是,当资源未添加到资源列表时,Zend ACL会抛出异常。举个例子:

$user1 = 'user-1';
$user2 = 'user-2';

$article1 = 'article-1';
$article2 = 'article-2';

$acl = new Acl();

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

$acl->addResource( $article1 );

$acl->allow( $user1, $article1 );

echo $acl->isAllowed( $user1, $article2 ) ? 'allowed' : 'denied';

如您所见,我正在创建3个角色,一个通用用户角色和两个用户特定角色。然后我创建两篇文章,我允许用户1访问文章1.但是,如果我现在测试用户1是否可以访问文章2,BOOM,异常!

`isAllowed'显然应该返回false而不是抛出异常。想象一下,我有1000个用户和1000篇文章,这意味着除了指定哪些用户可以访问哪篇文章外,我还需要指定每个用户无法访问哪些文章。这显然导致了很长的ACL和内存消耗,并且最重要的是,文章不是我唯一的资源类型!

isAllowed包裹在try/catch(显然是笨拙的)中的其他方法,应对这种奇怪行为的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我不确定你的commet是否意味着你已经没事了。 无论如何,在这种情况下,在你检查是否有事情之前,你可以做的只是:

 if(!$acl ->hasResource($resource))
                $acl -> addResource(new \Zend\Permissions\Acl\Resource\GenericResource($resource));

或者甚至花时间扩展默认ACL 类,因此isAllowed方法首先包含上面的代码。这将是一个简单的Poka-Yoke练习,它将允许您维护原始模型,您必须创建资源,同时促进常见或大多数用例的易用性。