Zend ACl Как реализовать пользовательское динамическое утверждение? - PullRequest
1 голос
/ 24 сентября 2019

Спасибо всем заранее за размещение ответов.На самом деле я изучаю Zend Framework, так что теперь я работаю с 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');
    }

1 Ответ

1 голос
/ 24 сентября 2019

Мой совет - использовать другой подход.

Сначала вы должны создать класс, в котором вы определите свои полные определения ACL, например, «My_Acl», расширяющий Zend_Acl.Зарегистрируйте в My_Acl все свои роли, ресурсы и привилегии.Создайте синглтон My_Acl, чтобы получить настроенный Acl (Zend_Acl), используя My_Acl :: getInstance ().Если вам нравится, вы также можете зарегистрировать этот экземпляр в своем Zend_Registry.

Поскольку вы хотите, чтобы пользователь имел права доступа к любому действию любого контроллера, я советую создать плагин и зарегистрировать его в predispatch,для того, чтобы проверить все доступ в одной точке.

Вы также можете создать помощник действий (например, My_Controller_Action_Helper_Acl) с помощью метода isAllowed, который проксирует $ alc-> isAllowed, чтобы проверить, доступна ли конкретная часть вашего действия текущему зарегистрированному пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...