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

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

  1. app/
  2. ___|./controller
  3. ___|./logic
  4. ___|./plugins
  5. ___|./models
  6. ..............

  

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

  1. app/
  2. ___|./admin/
  3. __________|./controllers
  4. __________|./logic
  5. __________|./views
  6. __________|./module.php
  7. ___|./home/
  8. __________|./controllers
  9. __________|./logic
  10. __________|./views
  11. __________|./module.php
  12. .........................................

  

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

  1. $di['aclResource']=function(){
  2. return include_once '../app/configs/frontAcl.php';
  3. };
  4. $di['dispatcher'] = function(){
  5. $eventManager = new \Phalcon\Events\Manager();
  6. $securyDeep = new \SecurityDeep();
  7. $eventManager->attach("dispatch", $securyDeep);
  8. $dispatch = new \Phalcon\Mvc\Dispatcher();
  9. $dispatch->setEventsManager($eventManager);
  10. return $dispatch;
  11. };

  

全代码:

  1. use Phalcon\Loader,
  2. Phalcon\Mvc\Url,
  3. Phalcon\Mvc\Dispatcher,
  4. Phalcon\DiInterface,
  5. Phalcon\Mvc\ModuleDefinitionInterface,
  6. Phalcon\DI\Injectable,
  7. Phalcon\Mvc\Router;
  8.  
  9. class Module extends Injectable implements ModuleDefinitionInterface
  10. {
  11.  
  12. /**
  13. * Registers the module auto-loader
  14. */
  15. public function registerAutoloaders(DiInterface $dependencyInjector = null)
  16. {
  17. $loader = new Loader();
  18. $loader->registerNamespaces(array(
  19. 'App\Home\Controllers' => __DIR__ .'/controllers/'
  20. ))->register();
  21. $loader->registerDirs(
  22. array(
  23. 'modelsDir' => '../app/models/',
  24. 'pluginsDir' => '../app/plugins/',
  25. )
  26. )->register();
  27.  
  28. }
  29.  
  30. /**
  31. * Registers the module-only services
  32. *
  33. * @param DiInterface $di
  34. */
  35. public function registerServices(DiInterface $di)
  36. {
  37.  
  38. $di['aclResource']=function(){
  39. return include_once '../app/configs/frontAcl.php';
  40. };
  41. $di['dispatcher'] = function(){
  42. $eventManager = new \Phalcon\Events\Manager();
  43. $securyDeep = new \SecurityHome();
  44. $eventManager->attach("dispatch", $securyDeep);
  45. $dispatch = new \Phalcon\Mvc\Dispatcher();
  46. $dispatch->setEventsManager($eventManager);
  47. return $dispatch;
  48. };
  49.  
  50. /**
  51. * @return mixed
  52. */
  53. $di['baseUrl'] = function () {
  54. $url = new Url();
  55. $url->setBaseUri('/');
  56. return $url;
  57. };
  58.  
  59. /**
  60. * 设置view
  61. */
  62. $di->set('view', function () use($di) {
  63. $view = new \Phalcon\Mvc\View();
  64. //var_dump($di['modules']['home']['viewsDir']);exit;
  65. $view->setViewsDir(BASE_PATH . $di['modules']['home']['viewsDir']);
  66. $view->registerEngines(array(
  67. '.phtml' => 'Phalcon\Mvc\View\Engine\Php'
  68. ));
  69. return $view;
  70.  
  71. });
  72.  
  73. }
  74.  
  75. }

  

acl文件:

  1. return new \Phalcon\Config(array(
  2. 'Manager'=>array(
  3. 'rote'=> new \Phalcon\Acl\Role("Manager"),
  4. 'resource'=>array(
  5. //登录
  6. 'Index'=> array("index", 'error'),
  7. //用户中心
  8. 'User'=> array("center", 'password','editcenter','editpwd','login','loginout'),
  9. //verzhun登录
  10. 'Veryzhun'=>array('login','logining'),
  11.  
  12. //默认所有权限
  13. 'Capacity'=>array('index','airline','route'),
  14. 'Clearance'=>array('airport','route'),
  15. 'Operate'=>array('factor','compare'),
  16. 'Traffic'=>array('index','history','monitor'),
  17. 'Utilization'=>array('moment','night'),
  18.  
  19. )
  20. ),
  21. 'Operator'=>array(
  22. 'rote'=> new \Phalcon\Acl\Role("Operator"),
  23. 'resource'=>array(
  24. 'Index'=> array("index", 'error'),
  25. 'User'=> array("center", 'password','editcenter','editpwd','login','loginout'),
  26. 'Veryzhun'=>array('login','logining'),
  27. 'Traffic'=>array('index','history','monitor'),
  28.  
  29. //默认所有权限
  30. //'Capacity'=>array('index','airline','route'),
  31. 'Clearance'=>array('airport','route'),
  32. 'Operate'=>array('factor','compare'),
  33. 'Traffic'=>array('index','history','monitor'),
  34. 'Utilization'=>array('moment','night'),
  35. )
  36. )
  37. ));

  

权限验证:

  1. /**
  2. * 权限控制
  3. */
  4. use \Phalcon\Mvc\User\Plugin,
  5. \Phalcon\Events\Event,
  6. \Phalcon\Mvc\Dispatcher;
  7. class SecurityHome extends Plugin{
  8.  
  9. public function __construct() { }
  10.  
  11. public function _getAcl()
  12. {
  13. $acl = new \Phalcon\Acl\Adapter\Memory();
  14.  
  15. //默认权限禁止
  16. $acl->setDefaultAction(\Phalcon\Acl::DENY);
  17. //读取所有权限
  18. $aclResource = $this->_callAcl();
  19.  
  20. if(!empty($aclResource))
  21. {
  22. foreach ($aclResource as $key=>$value)
  23. {
  24.  
  25. //创建角色到acl
  26. $acl->addRole($value['rote']);
  27. //所有的操作
  28. foreach ((array)$value['resource'] as $k=>$v)
  29. {
  30. //echo $k.'<br>';
  31. foreach((array)$v as $ky=>$vy)
  32. {
  33. //添加资源
  34. $acl->addResource(new \Phalcon\Acl\Resource(strtolower($k)), $vy);
  35. //添加访问权限
  36. $acl->allow($key, strtolower($k), $vy);
  37. //echo '|--'.$k.':'.$vy.'<br>';
  38. }
  39. }
  40. }
  41. }
  42.  
  43. return $acl;
  44.  
  45. }
  46.  
  47. public function _callAcl()
  48. {
  49. if($this->persistent->acl == null || $this->persistent->acl['Operator']['rote'] == null)
  50. {
  51. $this->persistent->acl = $this->aclResource;
  52. }
  53. return $this->persistent->acl;
  54. }
  55.  
  56. /**
  57. * 事件触发
  58. * @param Event $event
  59. * @param Dispatcher $dispatcher
  60. */
  61. public function beforeExecuteRoute(Event $event, Dispatcher $dispatcher)
  62. {
  63.  
  64. $controller = $dispatcher->getControllerName();
  65. $action = $dispatcher->getActionName();
  66.  
  67. //权限
  68. $role = 'Operator';
  69. $acl = $this->_getAcl();
  70. $isAllowed = $acl->isAllowed($role, strtolower($controller), strtolower($action));
  71.  
  72. if(!$isAllowed)
  73. {
  74.  
  75. $dispatcher->forward(array(
  76. 'controller'=>'index',
  77. 'action'=>'error',
  78. 'params'=>array('msg'=>'no access')
  79. ));
  80. //echo "no access";
  81. //exit;
  82. }
  83. }
  84.  
  85. }

  

接收获取到的数据:

  1. /**
  2. * 提示页面
  3. */
  4. public function errorAction()
  5. {
  6. //获取传过来的参数
  7. $param = $this->dispatcher->getParams();
  8. $msg = isset($param['msg']) ? $param['msg'] : '' ;
  9.  
  10. $this->view->web_title = '错误';
  11. $this->view->pick('index/error');
  12. }

  

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 IDE界面学习

  2. Java队列存储结构及实现

    一.队列(Queue) 队列是一种特殊的线性表,它只允许在表的前段(front)进行删除操作,只允许在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头. 对于一个队 ...

  3. C++学习笔记-隐式成员函数

    通过一个例子来复习C++操作符重载及隐式成员函数.MyString类模仿标准string类,简单的实现了构造一个字符串.字符串比较.取单个字符等功能.如下: #ifndef MYSTRING_H_ # ...

  4. Delphi FastReport动态加载图片 (转载)

    以前用FastReport制作报表,从来没有打印过图片,这段时间做了个打印个人简历的程序,需要打印照片.试着在frreport模板中加载照片没 问题,可是想要动态的装载照片要怎么做呢,我的要求是将个人 ...

  5. 微信小程序组件radio

    表单组件radio:官方文档 Demo Code: Page({ data: { items: [ {name: 'USA', value: '美国'}, {name: 'CHN', value: ' ...

  6. JavaScript-dom3 json_str dom元素控制 模拟百度搜索

    访问关系-封装代码 html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  7. java的接口为什么不能实例化

    java的接口为什么不能实例化呢?首先,我们需要明白实例化的含义.实例化实际意义是在jvm的堆中开辟出一块内存空间,比如Student s = new Student();此处声明Student对象s ...

  8. kafka的javaapi生产者生产消息,消费者获取不到

    zookeeper和kafka的日志没有出现什么报错 linux下kafka的命令行能生产并收到消费消息 但是在idea(windows环境下)中,调用api,获取不到数据,也生产不了数据,现象就是没 ...

  9. FFmpeg 入门(3):播放音频

    本文转自:FFmpeg 入门(3):播放音频 | www.samirchen.com 音频 SDL 提供了播放音频的方法.SDL_OpenAudio 函数用来让设备播放音频,它需要我们传入一个包含了所 ...

  10. 同时执行2条不同sql

    select * from  a: select *from b; 用分号结束.