Запретить доступ к частной зоне Phalcon PHP ACL

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

Я не хочу использовать Acl::DENY в качестве правила по умолчанию. Вместо этого я использую Acl::ALLOW в качестве глобального правила и запрещаю доступ к частным ресурсам.

Вот мой код:

<?php 
use Phalcon\Acl;
use Phalcon\Acl\Role;
use Phalcon\Acl\Resource;
use Phalcon\Events\Event;
use Phalcon\Mvc\User\Plugin;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Acl\Adapter\Memory as AclList;


class SecurityPlugin extends Plugin {

    public function getAcl() {
        if (!isset($this->persistent->acl)) {

            $acl = new AclList();
            $acl->setDefaultAction(Acl::ALLOW);

            $roles = array(
                'admin' => new Role('Administrators'),
                'guests' => new Role('Guests')
            );
            foreach ($roles as $role) {
                $acl->addRole($role);
            }

            //Private area resources
            $privateResources = array(
                'admin'        => array('index'),
                'products'     => array('index', 'search', 'new');

            foreach ($privateResources as $resource => $actions) {
                $acl->addResource(new Resource($resource), $actions);
            }

            foreach ($privateResources as $resource => $actions) {
                foreach ($actions as $action) {
                    $acl->deny('Guests', $resource, $action);
                }
            }

        }

        return $this->persistent->acl;
    }


    public function beforeDispatch(Event $event, Dispatcher $dispatcher) {

        $auth = $this->session->get('auth');
        if (!$auth) {
            $role = 'Guests';
        } else {
            $role = 'Admin';
        }

        $controller = $dispatcher->getControllerName();
        $action = $dispatcher->getActionName();

        $acl = $this->getAcl();

        $allowed = $acl->isAllowed($role, $controller, $action);
        if ($allowed != Acl::ALLOW) {
            $dispatcher->forward(array(
                'controller' => 'errors',
                'action'     => 'show401'
            ));
            $this->session->destroy();
            return false;
        }
    }
}

Спасибо за попытку помочь мне.


person Falundrim    schedule 23.05.2016    source источник


Ответы (1)


Вы забыли назначить свои определения ACL для $this->persistent->acl

public function getAcl() {
    if (!isset($this->persistent->acl)) {

        $acl = new AclList();

        ...

        //The acl is stored in session
        $this->persistent->acl = $acl;
    }

    return $this->persistent->acl;
}

Глядя на ваш код, я предполагаю, что вы использовали пример Phalcon INVO для этого SecurityPlugin? Если это так, см. строку 88. Если нет, это хороший и простой пример, который могу помочь тебе.

person Timothy    schedule 23.05.2016
comment
О, чувак, спасибо, я такой слепой ^^, спасибо за твои примеры, теперь я понимаю свои ошибки ... - person Falundrim; 25.05.2016