Zend - 控制器/动作ACL

时间:2011-11-23 12:28:05

标签: zend-framework

在我的管理模块中,我有一个名为email的控制器,我希望大多数操作只能由登录的管理员用户访问。但是,我希望任何人都可以访问一个操作。 (这是一个通过URL远程触发的电子邮件功能。)。目前我正在使用Zend_Auth和Zend_Acl这样:

if ($request->getModuleName() == 'admin') {
    // access resources (controllers)
    $acl->addResource('index');
    $acl->addResource('reports');
    $acl->addResource('email');
    $acl->addResource('error');

    // access roles
    $acl->addRole(new Zend_Acl_Role('visitor'));
    $acl->addRole(new Zend_Acl_Role('user'));
    $acl->addRole(new Zend_Acl_Role('admin'));

    // access rules
    $acl->deny('visitor');
    $acl->deny('user');
    $acl->allow('admin');

    $resouce = $request->getControllerName();
    $action = $request->getActionName();
    $identity = $auth->getStorage()->read();
    if (is_object($identity)) {
        $role = $identity->role;
    } else {
        $role = 'visitor';
    }

    if (!$acl->isAllowed($role, $resouce, $action)) {
        $request->setModuleName('default')
                ->setControllerName('auth')
                ->setActionName('login');
    }
}

如何更改上面的代码以允许'visitor'进行/ admin / email / process操作?

2 个答案:

答案 0 :(得分:3)

您可以使用Zend_Acl创建角色层次结构,以允许您设置访问页面的最小角色,任何角色为x或更高的人都可以访问该角色。

$acl->addRole(new Zend_Acl_Role('visitor'));
$acl->addRole(new Zend_Acl_Role('user'), 'visitor');
$acl->addRole(new Zend_Acl_Role('admin'), 'user');

这样,拥有管理员角色的任何人都可以访问visitoruser有权访问的任何内容。

您还可以传递array作为参数而不是字符串。

有关详细信息,请参阅ACL

上的Zend框架官方文档

答案 1 :(得分:2)

这应该可以解决问题:

$oAcl->allow('visitor','email','functionname');
//or if you want to do both visitor and user
$oAcl->allow(array('visitor','user'),'email','functionname');

将此代码放在您已编写的访问规则之后。