phalcon: eventManager事件管理(结合dispatcher调度控制器)制作简单的acl

制作简单的acl,

dispatcher(专门用来加载或调度或跳转到相应的url地址即XXXcontroller的调度器或控制器,能够在controller执行前对controller进行停止跳转等),控制器提供了一堆可以被调用的方法,即:action。action是控制器中用于处理请求的方法。默认情况下,全部 控制器public的方法都会映射到action并且可以通过URL访问。action负责解释请求和创建响应.

public/index.php

$di[‘aclResource‘] = function()
    {
        return include_once ‘../app/config/Acl.php‘;
    };

    //security
    $di[‘dispatcher‘] = function(){
        //events
        $eventsManager = new \Phalcon\Events\Manager();

        //读取acl权限的类
        $security = new Security();

        //lisent
        $eventsManager->attach("dispatch", $security);

        //调度器通过事件侦听acl
        $dispatch = new \Phalcon\Mvc\Dispatcher();
        $dispatch->setEventsManager($eventsManager);
        return $dispatch;
    }

  

app/plugins/Security类
use \Phalcon\Mvc\User\Plugin,
    \Phalcon\Events\Event,
    \Phalcon\Mvc\Dispatcher;

class Security extends Plugin {

    public function __construct(){}

    public function _getAcl()
    {
        $acl = new \Phalcon\Acl\Adapter\Memory();
        //默认权限(禁止)
        $acl->setDefaultAction(\Phalcon\Acl::DENY);
        //
        $aclResource = $this->_custAcl();
       foreach($aclResource as $key=>$value)
       {
           //创建角色,将角色添加到acl
          $acl->addRole($value[‘project_name‘]);
          foreach($value[‘resource‘] as $ky=>$vy)
          {
              foreach($vy as $k=>$v)
              {
                  //添加资源
                  $acl->addResource(new \Phalcon\Acl\Resource(strtolower($ky)), $v);
                  //添加访问权限
                  $acl->allow($value[‘project_name‘], strtolower($ky), $v);
              }
          }
       }
        return $acl;
    }

    public function _custAcl()
    {
        if( $this->persistent->acl == null)
        {
            $aclResource = array();
            $acl = $this->aclResource[‘Acl‘];
            $allResource = $this->aclResource[‘AllResource‘];
            foreach($acl as $key=>$value)
            {
                $tomer = array();
                $tomer[‘project_name‘] = $value;
                foreach($allResource as $k=>$v)
                {
                    if( strpos($k, strtolower($key) ) !== false )
                    {
                        $tomer[‘resource‘] = $v;
                    }
                }
                $aclResource[$key] = $tomer;
            }
            $this->persistent->acl = $aclResource;

        }
       return $this->persistent->acl;

    }

    public function beforeExecuteRoute(Event $event, Dispatcher $dispatcher )
    {
       $controller = $dispatcher->getControllerName();
       $action = $dispatcher->getactionName();
       $role = ‘‘;
       if( $this->session->has(‘userInfo‘) )
       {
            $userInfo = $this->session->get(‘userInfo‘);
           $role = $userInfo[‘role‘];
       }
       if(empty($role))$role = ‘Operator‘;
       $acl = $this->_getAcl();
       $isAllowed = $acl->isAllowed($role, strtolower($controller), strtolower($action));
       if(!$isAllowed)
       {
            echo "no access;";exit;
       }

    }

}

  

循环调度事件(Dispatch Loop Events)?

Phalcon\Mvc\Dispatcher 可以发送事件给当前的 EventsManager 。 事件会以“dispatch”类型被所触发。当返回false时有些事件可以终止当前激活的操作。已支持的事件如下:

事件名称 何时触发 此操作是否可终止? 触发于
beforeDispatchLoop 在进入循环调度前触发。此时,调度器不知道将要执行的控制器或者动作是否存在。调度器只知道路由传递过来的信息。 侦听者
beforeDispatch 在进入循环调度后触发。此时,调度器不知道将要执行的控制器或者动作是否存在。调度器只知道路由传递过来的信息。 侦听者
beforeExecuteRoute 在执行控制器/动作方法前触发。此时,调度器已经初始化了控制器并知道动作是否存在。 侦听者/控制器
initialize 允许在请求中全局初始化控制器。 控制器
afterExecuteRoute 在执行控制器/动作方法后触发。由于此操作不可终止,所以仅在执行动作后才使用此事件进行清理工作。 侦听者/控制器
beforeNotFoundAction 当控制器中的动作找不到时触发。 侦听者
beforeException 在调度器抛出任意异常前触发。 侦听者
afterDispatch 在执行控制器/动作方法后触发。由于此操作不可终止,所以仅在执行动作后才使用此事件进行清理工作。 侦听者
afterDispatchLoop 在退出循环调度后触发。 侦听者

				
时间: 2024-07-29 20:47:53

phalcon: eventManager事件管理(结合dispatcher调度控制器)制作简单的acl的相关文章

phalcon: plugin 结合Manager事件管理、dispatcher调度控制器 监听sql日志记录或其他拦截出来

可能用到的类 phalcon\mvc\use\plugin Phalcon\Mvc\Dispatcher as MvcDispatcher Phalcon\Events\Manager as EventsManager 代码部分 public/index.php: $di['db'] = function() use($di){ //log //事件管理 $eventManager = new \Phalcon\Events\Manager(); //继承了plugins的数据库sql操作类 $

6大开源SIEM工具,安全信息和事件管理的“利器”

为了保护IT环境免受网络攻击并遵守严格的合规标准,安全信息和事件管理(SIEM)系统正在成为越来越多企业实施的安全范例的基石. 有专门的平台提供一体化SIEM解决方案,如LogRhythm,QRadar和ArcSight.这些解决方案当然价格昂贵,特别是在长期和大型企业中,因此越来越多的企业正在寻找开源SIEM平台. 但是,是否有一个包含所有基本SIEM元素的开源平台? 简单回答是“没有”.没有所有功能于一身的完美的开源SIEM系统.现有的解决方案要么缺乏核心SIEM功能,如事件关联和报告,要么

phalcon——调度控制器

将侦听者绑定到组件上: use Phalcon\Mvc\Dispatcher as MvcDispatcher, Phalcon\Events\Manager as EventsManager; $di->set('dispatcher', function () { // 创建一个事件管理 $eventsManager = new EventsManager(); // 为“dispatch”类型附上一个侦听者 $eventsManager->attach("dispatch&qu

phalcon:model 事件与事件管理器

事件与事件管理器(Events and Events Manager)¶ Models allow you to implement events that will be thrown when performing an insert/update/delete. They help define business rules for a certain model. The following are the events supported by Phalcon\Mvc\Model an

storm事件管理器EventManager源码分析-event.clj

storm事件管理器定义在event.clj中,主要功能就是通过独立线程执行"事件处理函数".我们可以将"事件处理函数"添加到EventManager的阻塞队列中,EventManager的事件处理线程不断地从阻塞队列中获取"事件处理函数"并执行. EventManager协议 协议就是一组函数定义的集合,协议中函数的第一个参数必须为实现该协议的实例本身,类似于java中实例方法的第一个参数为this:协议类似于java中的接口. (defpro

事件管理器

项目开发过程中经常会用到代理事件,为方便管理,避免代码混乱,需要一个总的事件管理器: using UnityEngine; using System.Collections; using System.Collections.Generic; using System; public class EventManager<T> { private static Dictionary<EventType,List<Action<T>>> eventDic =

基于多个MPC的的调度控制器

1引言 本文J将对MATLAB自带的MPC例子进行详细剖析 MPC:Model Predictive Control Toolbox 开始设计工具:通过输入MATLAB命令:'mpctool'开始设计工具. 下图1中的图形中左侧的三个栏目分别为受控对象模型(plant model).模型预测控制器(Controllers).仿真器(Scenarios). 模型预测控制工具箱是一个图形用户界面的设计.这个GUI是控制和评估工具管理器GUI的一部分.见下图 Mo(measured output):当

Redis事件管理(一)

Redis统一的时间管理器,同时管理文件事件和定时器, 这个管理器的定义: #if defined(__APPLE__) #define HAVE_TASKINFO 1 #endif /* Test for backtrace() */ #if defined(__APPLE__) || (defined(__linux__) && defined(__GLIBC__)) #define HAVE_BACKTRACE 1 #endif /* Test for polling API */

cocos2d-js v3事件管理器

总概: 1.时间监听器(cc.EventListener)封装用户的事件处理逻辑. 2.事件管理器(cc.eventManager)管理用户注册的事件监听器. 3.事件对象(cc.Event)包含事件相关信息的对象. 事件监听器包含以下几种类型: 1.触摸事件监听器(cc.EventListenerTouch) 2.键盘事件监听器(cc.EventListenerKeyboard) 3.加速计事件监听器(cc.EventListenerAcceleration) 4.鼠标事件监听器(cc.Eve