【发布时间】:2014-01-04 00:12:17
【问题描述】:
我正在尝试让 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 中(这显然很笨拙)之外,应对这种奇怪行为的最佳方法是什么?
【问题讨论】:
-
深入研究,我现在似乎明白为什么会发生这种情况。上面的示例是一个硬编码示例,在动态情况下,要测试的资源将始终添加到 ACL 资源列表中。这意味着上面抛出异常的例子是正确的。
标签: zend-framework2 acl