phalcon: acl權限控制

目錄控制:php

 

public/index.php:web

$di['aclResource']=function(){
        return include_once '../app/config/frontbackAcl.php';
    };
    $di['dispatcher'] = function(){
        $eventManager = new \Phalcon\Events\Manager();
        $securyDeep = new SecurityDeep();
        $eventManager->attach("dispatch", $securyDeep);
        $dispatch = new \Phalcon\Mvc\Dispatcher();
        $dispatch->setEventsManager($eventManager);
        return $dispatch;
    };

  

app/config/frontbackAcl.php:session

return new \Phalcon\Config(array(

        'Manager'=> array(
            'rote'=>new \Phalcon\Acl\Role("Manager"),
            'resource'=>array(
                'Index'=> array("index", 'last', 'login', 'signup'),
                'Register'=> array('index', 'doing'),
                'Delete'=>array('index', 'delete')
            )
        ),
        'Operator'=>array(
            'rote'=>new \Phalcon\Acl\Role("Operator"),
            'resource'=>array(
                'Index'=> array("index", 'last', 'login','signup'),
                'Register'=> array('index', 'doing'),
            )
        )

));

  

securityDeep.php:app

use \Phalcon\Mvc\User\Plugin,
    \Phalcon\Events\Event,
    \Phalcon\Mvc\Dispatcher;
class SecurityDeep extends Plugin {

    public function __construct() { }

    public function _getAcl()
    {
        $acl = new \Phalcon\Acl\Adapter\Memory();
        //默認權限
        $acl->setDefaultAction(\Phalcon\Acl::DENY);
        //建立
        $allResource = $this->_callAcl();
        foreach($allResource as $key=>$value)
        {
            //建立角色,並將角色添加到acl
            $acl->addRole($value['rote']);
            //var_dump($value['rote']);
            foreach($value['resource'] as $k=>$v)
            {
                //echo $k.'<br>';
                foreach($v as $ky=>$vy)
                {
                    //添加資源
                    $acl->addResource(new \Phalcon\Acl\Resource(strtolower($k)), $vy);
                    //添加訪問權限
                    $acl->allow($key, strtolower($k), $vy);
                   // echo '|--'.$k.':'.$vy.'<br>';
                }
            }
        }
        return $acl;
    }
    public function _callAcl()
    {
        if($this->persistent->acl == null) {
            $this->persistent->acl =  $this->aclResource;
        }
        return $this->persistent->acl;
    }

    public function beforeExecuteRoute(Event $event, Dispatcher $dispatcher)
    {
        $controller = $dispatcher->getControllerName();
        $action = $dispatcher->getActionName();
        $role = '';
        if( $this->session->has('userInfo'))
        {
            $managerInfo = $this->session->get('userInfo');
            $role = $managerInfo['role'];
        }
        if(empty($role)) $role = 'Operator';
        $acl = $this->_getAcl();
        $isAllowed = $acl->isAllowed($role, strtolower($controller), strtolower($action));
        if(!$isAllowed)
        {
            //echo "no access";exit;
        
$dispatcher->forward(array(
'controller'=>'index',
'action'=>'error',
'params'=>array('msg'=>'no access')
));

} } }

  

 

那麼,在indexController.php頁面中,能夠經過以下方法,獲取params傳過來的值:this

public function errorAction()
    {
        //獲取傳過來的參數
        $param = $this->dispatcher->getParams();
        $msg = isset($param['msg'])? $param['msg'] : '' ;
        
        
        $this->view->web_title = '錯誤';
        $this->view->pick('index/error');
    }
相關文章
相關標籤/搜索