3

I am trying to follow an online tutorial in Phalcon PHP, and I'm at the stage where we are creating an ACL, and setting permissions based on the user's role (which is pulled from a session variable).

However, even when a user logs in, and their role changes from guest to user, the permissions file does not seem to set their permissions correctly, and so they do not get forwarded to their dashboard, but instead drop back to the login screen.

Permissions.php

use Phalcon\Mvc\Dispatcher;
use Phalcon\Events\Event;
use Phalcon\Acl;

class Permission extends Phalcon\Mvc\User\Plugin
{
    const GUEST = 'guest';
    const USER = 'user';
    const ADMIN = 'admin';

    protected $_publicResources = [
        'index' => '*',
        'login' => '*'
    ];
    protected $_userResources = [
        'dashboard' => ['*'],
        'logout' => ['*']
    ];
    protected $_adminResources = [
        'admin' => ['*']
    ];

    public function beforeExecuteRoute(Event $event, Dispatcher $dispatcher)
    {
        $role = $this->session->get('role');
        if (!$role) {
            $role = self::GUEST;
        }

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

        $acl = $this->_getAcl();

        $allowed = $acl->isAllowed($role, $controller, $action);

        if ($allowed != Acl::ALLOW) {
            $this->response->redirect('login/');

            return false;
        }
    }

    protected function _getAcl()
    {
        if (!isset($this->persistent->acl)) {
            $acl = new Acl\Adapter\Memory();
            $acl->setDefaultAction(Acl::DENY);

            $roles = [
                self::GUEST => new Acl\Role(self::GUEST),
                self::USER => new Acl\Role(self::USER),
                self::ADMIN => new Acl\Role(self::ADMIN)
            ];

            foreach ($roles as $role) {
                $acl->addRole($role);
            }

            foreach ($this->_publicResources as $resource => $action) {
                $acl->addResource(new Acl\Resource($resource), $action);
            }

            foreach ($this->_userResources as $resource => $action) {
                $acl->addResource(new Acl\Resource($resource), $action);
            }

            foreach ($this->_adminResources as $resource => $action) {
                $acl->addResource(new Acl\Resource($resource), $action);
            }

            foreach ($roles as $role) {
                foreach ($this->_publicResources as $resource => $action) {
                    $acl->allow($role->getName(), $resource, '*');
                }
            }

            foreach ($this->_userResources as $resource => $actions) {
                foreach ($actions as $action) {
                    $acl->allow(self::USER, $resource, $action);
                    $acl->allow(self::ADMIN, $resource, $action);
                }
            }

            foreach ($this->_adminResources as $resource => $actions) {
                foreach ($actions as $action) {
                    $acl->allow(self::ADMIN, $resource, $action);
                }
            }

            $this->persistent->acl = $acl;
        }

        return $this->persistent->acl;
    }
}

And if I print_r($acl), this is what I get:

Phalcon\Acl\Adapter\Memory Object
(
    [_eventsManager:protected] => 
    [_defaultAccess:protected] => 0
    [_accessGranted:protected] => 1
    [_activeRole:protected] => user
    [_activeResource:protected] => index
    [_activeAccess:protected] => index
    [_rolesNames:protected] => Array
        (
            [guest] => 1
            [user] => 1
            [admin] => 1
        )

    [_roles:protected] => Array
        (
            [0] => Phalcon\Acl\Role Object
                (
                    [_name:protected] => guest
                    [_description:protected] => 
                )

            [1] => Phalcon\Acl\Role Object
                (
                    [_name:protected] => user
                    [_description:protected] => 
                )

            [2] => Phalcon\Acl\Role Object
                (
                    [_name:protected] => admin
                    [_description:protected] => 
                )

        )

    [_resourcesNames:protected] => Array
        (
            [*] => 1
            [index] => 1
            [login] => 1
            [dashboard] => 1
            [logout] => 1
            [admin] => 1
        )

    [_resources:protected] => Array
        (
            [0] => Phalcon\Acl\Resource Object
                (
                    [_name:protected] => index
                    [_description:protected] => 
                )

            [1] => Phalcon\Acl\Resource Object
                (
                    [_name:protected] => login
                    [_description:protected] => 
                )

            [2] => Phalcon\Acl\Resource Object
                (
                    [_name:protected] => dashboard
                    [_description:protected] => 
                )

            [3] => Phalcon\Acl\Resource Object
                (
                    [_name:protected] => logout
                    [_description:protected] => 
                )

            [4] => Phalcon\Acl\Resource Object
                (
                    [_name:protected] => admin
                    [_description:protected] => 
                )

        )

    [_access:protected] => Array
        (
            [guest!*!*] => 0
            [user!*!*] => 0
            [admin!*!*] => 0
            [guest!index!*] => 1
            [guest!login!*] => 1
            [user!index!*] => 1
            [user!login!*] => 1
            [admin!index!*] => 1
            [admin!login!*] => 1
        )

    [_roleInherits:protected] => 
    [_accessList:protected] => Array
        (
            [*!*] => 1
            [index!*] => 1
            [login!*] => 1
            [dashboard!*] => 1
            [logout!*] => 1
            [admin!*] => 1
        )

    [_func:protected] => 
    [_noArgumentsDefaultAction:protected] => 1
)
mpdc
  • 3,550
  • 5
  • 25
  • 48
  • What phalcon version you are using ? My acl has `[user!dashboard!*] => 1` On 3.0.x from your example. Also use role inheritance, you don't need to add userResources to both admin and user. You can just inherit admin role from user role etc. – Juri Aug 17 '16 at 14:36
  • Out of curiousity are your controllers in a Namespace? If so you could try this: `protected $_publicResources = ['\Controllers\Index' => '*',];` -- Im trying to solve this at the moment will let you know if i do! – JREAM Aug 30 '17 at 13:02

0 Answers0