zoukankan      html  css  js  c++  java
  • phalcon: 目录分组后的acl权限控制

    phalcon: 目录分组后的acl权限控制

    楼主在做acl权限的时候,发现官方的acl只能针对未分组的目录,如下:

    app/
    ___|./controller
    ___|./logic
    ___|./plugins
    ___|./models
    ..............   
    

      

    但是对分组不支持,后来想想,是支持的.分组的目录如下

    app/
    ___|./admin/
    __________|./controllers
    __________|./logic
    __________|./views
    __________|./module.php
    ___|./home/
    __________|./controllers
    __________|./logic
    __________|./views
    __________|./module.php
    .........................................
    

      

    那么可以将,如下代码,直接加入到,分组目录下的 module.php代码中

    $di['aclResource']=function(){
                return include_once '../app/configs/frontAcl.php';
            };
            $di['dispatcher'] = function(){
                $eventManager = new PhalconEventsManager();
                $securyDeep = new SecurityDeep();
                $eventManager->attach("dispatch", $securyDeep);
                $dispatch = new PhalconMvcDispatcher();
                $dispatch->setEventsManager($eventManager);
                return $dispatch;
            };
    

      

    全代码:

    use PhalconLoader,
        PhalconMvcUrl,
        PhalconMvcDispatcher,
        PhalconDiInterface,
        PhalconMvcModuleDefinitionInterface,
        PhalconDIInjectable,
        PhalconMvcRouter;
    
    class Module extends Injectable implements ModuleDefinitionInterface
    {
    
        /**
         * Registers the module auto-loader
         */
        public function registerAutoloaders(DiInterface $dependencyInjector = null)
        {
            $loader = new Loader();
            $loader->registerNamespaces(array(
                'AppHomeControllers' => __DIR__ .'/controllers/'
            ))->register();
            $loader->registerDirs(
                array(
                    'modelsDir'      => '../app/models/',
    				'pluginsDir'      => '../app/plugins/',
                )
            )->register();
    
        }
    
        /**
         * Registers the module-only services
         *
         * @param DiInterface $di
         */
        public function registerServices(DiInterface $di)
        {        
    
            $di['aclResource']=function(){
                return include_once '../app/configs/frontAcl.php';
            };
            $di['dispatcher'] = function(){
                $eventManager = new PhalconEventsManager();
                $securyDeep = new SecurityHome();
                $eventManager->attach("dispatch", $securyDeep);
                $dispatch = new PhalconMvcDispatcher();
                $dispatch->setEventsManager($eventManager);
                return $dispatch;
            };
    
    
    
            /**
             * @return mixed
             */
            $di['baseUrl'] = function () {
                $url = new Url();
                $url->setBaseUri('/');
                return $url;
            };
    
    
    
            /**
             * 设置view
             */
            $di->set('view', function () use($di)  {
                $view = new PhalconMvcView();
                //var_dump($di['modules']['home']['viewsDir']);exit;
                $view->setViewsDir(BASE_PATH . $di['modules']['home']['viewsDir']);
                $view->registerEngines(array(
                    '.phtml' => 'PhalconMvcViewEnginePhp'
    				));
                return $view;
    			
            });
    
    
        }
    
    }
    

      

    acl文件:

    return new PhalconConfig(array(
        'Manager'=>array(
            'rote'=> new PhalconAclRole("Manager"),
            'resource'=>array(
                //登录
                'Index'=> array("index", 'error'),
                //用户中心
                'User'=> array("center", 'password','editcenter','editpwd','login','loginout'),
                //verzhun登录
                'Veryzhun'=>array('login','logining'),
    
                //默认所有权限
                'Capacity'=>array('index','airline','route'),
                'Clearance'=>array('airport','route'),
                'Operate'=>array('factor','compare'),
                'Traffic'=>array('index','history','monitor'),
                'Utilization'=>array('moment','night'),
    
            )
        ),
        'Operator'=>array(
            'rote'=> new PhalconAclRole("Operator"),
            'resource'=>array(
                'Index'=> array("index", 'error'),
                'User'=> array("center", 'password','editcenter','editpwd','login','loginout'),
                'Veryzhun'=>array('login','logining'),
                'Traffic'=>array('index','history','monitor'),
    
                //默认所有权限
                //'Capacity'=>array('index','airline','route'),
                'Clearance'=>array('airport','route'),
                'Operate'=>array('factor','compare'),
                'Traffic'=>array('index','history','monitor'),
                'Utilization'=>array('moment','night'),
            )
        )
    ));
    

      

    权限验证:

    /**
     * 权限控制
     */
    use PhalconMvcUserPlugin,
        PhalconEventsEvent,
        PhalconMvcDispatcher;
    class SecurityHome extends Plugin{
    
        public function __construct() { }
    
        public function _getAcl()
        {
            $acl = new PhalconAclAdapterMemory();
    
            //默认权限禁止
            $acl->setDefaultAction(PhalconAcl::DENY);
            //读取所有权限
            $aclResource = $this->_callAcl();
    
            if(!empty($aclResource))
            {
                foreach ($aclResource as $key=>$value)
                {
    
                    //创建角色到acl
                    $acl->addRole($value['rote']);
                    //所有的操作
                    foreach ((array)$value['resource'] as $k=>$v)
                    {
                        //echo $k.'<br>';
                        foreach((array)$v as $ky=>$vy)
                        {
                            //添加资源
                            $acl->addResource(new PhalconAclResource(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['Operator']['rote'] == null)
            {
                $this->persistent->acl = $this->aclResource;
            }
            return $this->persistent->acl;
        }
    
        /**
         * 事件触发
         * @param Event $event
         * @param Dispatcher $dispatcher
         */
        public function beforeExecuteRoute(Event $event, Dispatcher $dispatcher)
        {
    
            $controller = $dispatcher->getControllerName();
            $action = $dispatcher->getActionName();
    
            //权限
            $role = 'Operator';
            $acl = $this->_getAcl();
            $isAllowed = $acl->isAllowed($role, strtolower($controller), strtolower($action));
    
            if(!$isAllowed)
            {
    
                $dispatcher->forward(array(
                    'controller'=>'index',
                    'action'=>'error',
                    'params'=>array('msg'=>'no access')
                ));
                //echo "no access";
                //exit;
            }
        }
    
    }
    

      

     接收获取到的数据:

    /**
         * 提示页面
         */
        public function errorAction()
        {
            //获取传过来的参数
            $param = $this->dispatcher->getParams();
            $msg = isset($param['msg']) ? $param['msg'] : '' ;
    
    
            $this->view->web_title = '错误';
            $this->view->pick('index/error');
        }
    

      

  • 相关阅读:
    PyQt5使用http请求获取天气
    Qt获取某地的天气情况
    各种编码方式
    Qt获取天气信息并解析
    QFile读文件
    QUrl
    Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())的注意点
    adb命令开关蓝牙及NFC
    fragment重叠问题解决方法
    Android跨进程启动另外一个应用界面时存在的问题解决办法
  • 原文地址:https://www.cnblogs.com/achengmu/p/9044431.html
Copyright © 2011-2022 走看看