2016-05-23 13 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; 
     } 
    } 
} 

は私を助けようとするために、ありがとうございます。あなたが実際にあなたのコードを見ることで$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; 
} 

にあなたのACLの定義を割り当てるのを忘れ

答えて

0

、私はあなたがこのSecurityPluginためPhalcon INVOの例を使用し推測していますか? の場合line 88を参照してください。そうでない場合、thisはあなたを助ける素晴らしい簡単な例です。

+0

ああ、ありがとう、私はとても盲目です^^、あなたのexemplesのためにthxあまりにも今私は間違いを理解する... – Falundrim

関連する問題