Zend ACl如何实现自定义动态声明?

问题描述 投票:1回答:1

感谢大家提前发布答案。实际上,我正在学习Zend框架,因此现在我正在与Zend ACL一起工作,以允许/拒绝多个用户角色访问控制器/操作。因此,为此,我确实在app/controllers/helpers/acl.php中创建了一个辅助程序,并在app/bootstrap.php中创建了一个代码。现在,我确实在bootstrap.php中使用了此帮助程序,因此当应用程序将被加载/初始化时,它将可以正常工作。现在它可以正常工作了,但是我正在寻找新的东西,我想添加自定义断言,其中只允许与他有关的用户,就像我只能编辑或删除我创建它的帖子一样。

因此,如果您可以帮助我,请这样做。我的代码发布在下面

文件App / Controllers / Helpers / Acl.php

<?php
require_once 'Zend/Controller/Action/Helper/Abstract.php';

class Zend_Controller_Action_Helper_Acl extends Zend_Controller_Action_Helper_Abstract {

    protected $acl;
    protected $role;

    function __construct() {
        $this->sess = new Zend_Session_Namespace("session");
        $this->logger = Zend_Registry::get('logger');
    }

    protected function getAcl(){

        if (is_null($this->acl)){

            $acl = new Zend_Acl();

            $roles  = array('owner', 'administrator', 'editor', 'readonly');

            $controllers = array('index', 'projects', 'applications', 'checks', 'settings', 'ajax', 'error', 'languageswitch');

            //Add Roles
            foreach ($roles as $role) {
                $acl->addRole(new Zend_Acl_Role($role));
            }

            //Add Resources
            foreach ($controllers as $controller) {
                $acl->add(new Zend_Acl_Resource($controller));

                //Administrator, Editior, Readonly
                if($controller == 'projects'){
                    $acl->allow('administrator', $controller, array('main', 'add', 'detail', 'edit'));
                    $acl->allow('editor', $controller, array('main', 'add', 'detail', 'edit'));
                    $acl->allow('readonly', $controller, array('main', 'add', 'detail'));
                }else if($controller == 'applications'){
                    $acl->allow('administrator', $controller, array('main', 'add', 'detail', 'edit', 'auditview', 'delete'));
                    $acl->allow('editor', $controller, array('main', 'add', 'detail', 'edit', 'audit'));
                    $acl->allow('readonly', $controller, array('main', 'detail', 'audit'));
                }else {
                    $acl->allow('administrator', $controller);
                    $acl->allow('editor', $controller);
                    $acl->allow('readonly', $controller);
                }
            }

            //Owner
            $acl->allow('owner'); // Owner Has access to everything.

            $this->acl = $acl;

        }

        return $this->acl;

    }

    protected function getRole(){

        if (is_null($this->role)){

            $session = new Zend_Session_Namespace('session');
            $role = (isset($session->currentrole)) ? $session->currentrole : 'guest';
            $this->role = $role;

        }

        return $this->role;

    }

    public function direct($resource, $privilege = null){

        $acl = $this->getAcl();
        $role = $this->getRole();
        $allowed = $acl->isAllowed($role, $resource, $privilege);
        return $allowed;
    }

}

文件App / Bootstrap.php

    //Set Role Permission
    $acl = new Zend_Controller_Action_Helper_Acl();
    Zend_Registry::set('acl', $acl);

    $permission = Zend_Registry::get('acl');
    $request = new Zend_Controller_Request_Http();
    $resource = $request->getControllerName();
    $privilege = $request->getActionName();
    if (!$permission->direct($resource, $privilege)) {
        $request->setControllerName('error');
        $request->setActionName('error');
    }
php zend-framework
1个回答
1
投票

我的建议是使用其他方法。

[首先,您应该创建一个类,在其中定义完整的ACL定义,例如,扩展了Zend_Acl的“ My_Acl”。在My_Acl中注册您的所有角色,资源和特权。设置“ My_Acl”为单例,以便使用My_Acl :: getInstance()获得配置的Acl(Zend_Acl)。如果您愿意,也可以在Zend_Registry中注册该实例。

由于您要签入,用户具有访问任何控制器的任何操作的特权,所以我的建议是创建一个插件并在分派前进行注册,以便在一个点上检查所有访问。

您还可以使用isAllowed方法创建$ alc-> isAllowed代理的操作助手(例如My_Controller_Action_Helper_Acl,以检查当前登录用户是否可以访问您的操作的特定部分。

© www.soinside.com 2019 - 2024. All rights reserved.