2016-05-23 6 views
0

Я хотел бы запретить доступ к частным местам на моем веб-сайте. Но я не знаю, что я делаю неправильно.Запрет доступа в частную зону 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; 
     } 
    } 
} 

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

ответ

0

Вы забыли фактически назначить определения 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? Если это так, см. line 88. Если нет, this - это хороший и простой пример, который может вам помочь.

+0

О, мужик, спасибо, я так слепой ^^, THX для ваших примеров тоже теперь понимаю мои ошибки ... – Falundrim

 Смежные вопросы

  • Нет связанных вопросов^_^