четверг, 20 июня 2013 г.

ACL, закрываем доступ к роутам в зависимости от настроенных ролей

Тут показан пример того как я закрыл доступ неавторизированным пользователям к внутренним разделам сайта при помощи ACL. Код был успешно скопипастен с http://ivangospodinow.com за что ему огромное спасибо.

Для начала создаем файл: module/Frontend/config/module.acl.roles.php

<?php
//module/Frontend/config/module.acl.roles.php
return array(
    'guest'=> array(
        'index',
        'register',
    ),
    'auth'=> array(
        'about',
        'inquiry',
    ),
);

'index', 'register' и т.д. - это роуты контроллеров для которых я устанавливаю правила.   Далее в файле module.php прописываем следуещее:
 
    public function onBootstrap(MvcEvent $e)
    {
        // common code.... 
        $this -> initAcl($e);
        $e->getApplication()
            ->getEventManager()
            ->attach('route', array($this, 'checkAcl'));
    } 
    public function initAcl(MvcEvent $e) {
        $acl = new \Zend\Permissions\Acl\Acl();
        $roles = include __DIR__ . '/config/module.acl.roles.php';
        $allResources = array();
        foreach ($roles as $role => $resources) {

            $role = new \Zend\Permissions\Acl\Role\GenericRole($role);
            $acl -> addRole($role);

            $allResources = array_merge($resources, $allResources);

            //adding resources
            foreach ($resources as $resource) {
                $acl -> addResource(new \Zend\Permissions\Acl\Resource\GenericResource($resource));
            }
            //adding restrictions
            foreach ($allResources as $resource) {
                $acl -> allow($role, $resource);
            }
        }
        $e -> getViewModel() -> acl = $acl;

    }

    public function checkAcl(MvcEvent $e) {
        $route = $e -> getRouteMatch() -> getParam('__CONTROLLER__');

        //you set your role
        $userRole = 'guest';

        if ($e -> getViewModel() -> acl ->hasResource($route) && !$e -> getViewModel() -> acl -> isAllowed($userRole, $route)) {
            $response = $e -> getResponse();
            //location to page or what ever
            $response -> getHeaders() -> addHeaderLine('Location', $e -> getRequest() -> getBaseUrl() . '/');
            $response -> setStatusCode(303);

        }
    }
 
собственно из самого кода многое становится понятным и модифицировать его под себя не составит труда.

P.S. Прошу прощение за форматирование кода, в ближайшее время настрою скрипты.

Комментариев нет:

Отправить комментарий