Zend ACL仅拒绝来自子角色资源的父角色

时间:2012-02-23 18:41:36

标签: zend-framework acl

我正在尝试在Zend Framework中实现ACL。我希望父角色可以访问除允许子角色的资源之外的所有资源。到目前为止我有以下代码:

$acl = new Zend_Acl();
$acl->addRole('visitor')
    ->addRole('subscriber', 'visitor')
    ->addRole('editor', 'subscriber')
    ->addRole('admin', 'editor')
    ->addRole('superadmin', 'admin')
    ->allow();

$acl->addResource('index')
    ->addResource('blog')
    ->addResource('users')
    ->addResource('admin');

acl->allow('subscriber', 'blog', 'index')
    ->allow('editor', 'blog', array('add', 'edit'))
    ->allow('admin', 'admin')
    ->allow('superadmin', 'users');

我希望“访问者”能够访问所有资源 ,但除了允许子角色订阅者,编辑者,管理员,superadmin的资源。所有其他角色和资源都相同。 “visitor”可以访问所有资源,但不能访问允许子角色使用的资源。

2 个答案:

答案 0 :(得分:1)

我也在和Zend_Acl合作,我想我明白了。 “问题”是,默认情况下,Zend拒绝访问每个资源,而您没有指定某些用户有权访问所需资源。

这意味着当您创建ACL(角色,资源,权限)时,您必须告知您希望授予访问者访问他可以访问的每个资源的权限。

我认为Zend以安全方式工作,因为这样您就可以确定只有您授予访问权限的用户才有权与指定的资源进行交互。

答案 1 :(得分:0)

“订阅者”不是“访问者”的父级,但实际上是子级。因此,订阅者继承访问者的所有资源和特权。 你并没有真正提出任何问题,但似乎你想要的是Zend_Acl的预期行为。

$acl = new Zend_Acl();
$acl->addRole('visitor')
->addRole('subscriber', 'visitor')
->addRole('editor', 'subscriber')
->addRole('admin', 'editor')
->addRole('superadmin', 'admin');

$acl->addResource('index')
->addResource('blog')
->addResource('users')
->addResource('admin');

$acl->allow('subscriber', 'blog', 'index')
->allow('editor', 'blog', array('add', 'edit'))
->allow('admin', 'admin')
->allow('superadmin', 'users');

添加$acl->allow('visitor', 'index', 'index')访客现在可以访问索引页面,其子级也可以访问索引页面。但是访客无法访问资源博客和权限索引只有订阅者及其子级才能访问此页面< /强>

你应该阅读documentation of Zend_Acl,有很多很好的例子。