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 \Phalcon\Events\Manager();
$securyDeep = new \SecurityDeep();
$eventManager->attach("dispatch", $securyDeep);
$dispatch = new \Phalcon\Mvc\Dispatcher();
$dispatch->setEventsManager($eventManager);
return $dispatch;
};

  

全代码:

use Phalcon\Loader,
Phalcon\Mvc\Url,
Phalcon\Mvc\Dispatcher,
Phalcon\DiInterface,
Phalcon\Mvc\ModuleDefinitionInterface,
Phalcon\DI\Injectable,
Phalcon\Mvc\Router; class Module extends Injectable implements ModuleDefinitionInterface
{ /**
* Registers the module auto-loader
*/
public function registerAutoloaders(DiInterface $dependencyInjector = null)
{
$loader = new Loader();
$loader->registerNamespaces(array(
'App\Home\Controllers' => __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 \Phalcon\Events\Manager();
$securyDeep = new \SecurityHome();
$eventManager->attach("dispatch", $securyDeep);
$dispatch = new \Phalcon\Mvc\Dispatcher();
$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 \Phalcon\Mvc\View();
//var_dump($di['modules']['home']['viewsDir']);exit;
$view->setViewsDir(BASE_PATH . $di['modules']['home']['viewsDir']);
$view->registerEngines(array(
'.phtml' => 'Phalcon\Mvc\View\Engine\Php'
));
return $view; }); } }

  

acl文件:

return new \Phalcon\Config(array(
'Manager'=>array(
'rote'=> new \Phalcon\Acl\Role("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 \Phalcon\Acl\Role("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 \Phalcon\Mvc\User\Plugin,
\Phalcon\Events\Event,
\Phalcon\Mvc\Dispatcher;
class SecurityHome extends Plugin{ public function __construct() { } public function _getAcl()
{
$acl = new \Phalcon\Acl\Adapter\Memory(); //默认权限禁止
$acl->setDefaultAction(\Phalcon\Acl::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 \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['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');
}

  

phalcon: 目录分组后的acl权限控制的更多相关文章

  1. Linux系统——ACL权限控制及特殊权限

    ACL权限控制 ACL(access control list),可以提供除属主.属组.其他人的rwx权限之外的细节权限设定 ACL的权限控制 (1)User 使用者 (2)Group 群组 (3)M ...

  2. zookeeper的ACL权限控制

    ACL:Access Control List  访问控制列表 1.  简介 0.概述 ACL 权限控制,使用:scheme:id:perm 来标识,主要涵盖 3 个方面: 权限模式(Scheme): ...

  3. 1.ZooKeeper ACL权限控制

    参考:https://blog.csdn.net/liuxiao723846/article/details/79391650 ZK 类似文件系统,Client 可以在上面创建节点.更新节点.删除节点 ...

  4. <实训|第十三天>linux中ACL权限控制以及磁盘配额,附编译属于自己的linux内核

    [root@localhost~]#序言 首先讲讲昨天关于缩容失败,开不机的解决方法:ACL权限也算是一个很重要的知识点,不难,但是很实用:磁盘配额一般不需要自己弄,但是要懂得原理.剩下的就是编译属于 ...

  5. ACL权限控制列表

    1.查看文件系统是否支持ACL (xfs文件系统强制开启ACL,如果该分区已格式化为xfs,在使用dumpe2fs会看不到superblocks信息)zheng@ubuntu16:~$ sudo du ...

  6. ZooKeeper学习之路(五)—— ACL权限控制

    一.前言 为了避免存储在Zookeeper上的数据被其他程序或者人为误修改,Zookeeper提供了ACL(Access Control Lists)进行权限控制.只有拥有对应权限的用户才可以对节点进 ...

  7. ZooKeeper系列(五)—— ACL 权限控制

    一.前言 为了避免存储在 Zookeeper 上的数据被其他程序或者人为误修改,Zookeeper 提供了 ACL(Access Control Lists) 进行权限控制.只有拥有对应权限的用户才可 ...

  8. Linux下ACL权限控制以及用sudo设置用户对命令的执行权限

    ACL权限分配 1.setfacl命令设置文件权限 setfacl -m u:user1:rw root.txt setfacl -m u:user2:rwx root.txt 2.getfacl命令 ...

  9. LInux ACL权限控制

    1.ACL简介 ACL是一种可以实现灵活的权限管理(文件的额外赋权机制)除了文件所有者,所属组和其他人,可以对更多的用户设置权限,这就是访问控制列表(Access Control List) 2.AC ...

随机推荐

  1. Selenium的PageFactory & PageObject 在大型项目中的应用

    因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看selenium的源代码,之前写测试代码的时候就是拿来即用,写什么功能啊,就按手动的操作步骤去转换,近日看到一个文章,又去wiki上查了查,觉 ...

  2. debian flam3 源码

    https://packages.debian.org/source/jessie/flam3 Source Package: flam3 (3.0.1-3) Links for flam3 Debi ...

  3. Java基础知识陷阱(三)

    本文发表于本人博客. 之前都讲了有关字符串的陷阱,那今天来说下关于静态这个东西,这分为静态变量.静态方法,先看下面的代码请问结果输出是什么?: class Person01{ private stat ...

  4. xphrof出现502问题

    This is an xhprof bug and not a devel bug, but I thought I'd throw the workaround up here in case pe ...

  5. 160726 smarty 笔记(2)

    <?php //取当前页 $p=1; if(!empty($_GET["page"])) { $p=$_GET["page"]; } //定义页面缓存文件 ...

  6. node的3大作用域

    除了持久性存储外,想要内存也可以存入数据,来做计算什么数据都存入访问一便数据库,效率就太低了 java有3大作用域request 指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应 ...

  7. nmon监控及简要分析

    性能测试中,各个服务器资源占用统计分析是一个很重要的组成部分,通常我们使用nmon这个工具来进行监控以及监控结果输出. 一. 在监控阶段使用类似下面的命令 ./nmon -f write_3s_20v ...

  8. java泛型的实现原理

    java泛型的实现原理是类型擦除.Java的泛型是伪泛型.在编译期间,所有的泛型信息都会被擦除掉.   Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节码中是不包含泛型中的类型 ...

  9. 【Python】__slots__ 、@property、多重继承、定制类、枚举类、元类

    __slots__ @property 多重继承 定制类 枚举类 元类 [使用__slots__] 1.动态语言的一个特点就是允许给实例绑定任意的方法和变量,而静态语言(例如Java)必须事先将属性方 ...

  10. Swoole学习(五)Swoole之简单WebSocket服务器的创建

    环境:Centos6.4,PHP环境:PHP7 服务端代码 <?php //创建websocket服务器 $host = '0.0.0.0'; $port = ; $ws = new swool ...