一个完整的使用实例(将acl封装成一个插件使用):

  1. use Phalcon\Acl;
  2. use Phalcon\Acl\Role;
  3. use Phalcon\Acl\Resource;
  4. use Phalcon\Events\Event;
  5. use Phalcon\Mvc\User\Plugin;
  6. use Phalcon\Mvc\Dispatcher;
  7. use Phalcon\Acl\Adapter\Memory as AclList;
  8.  
  9. class SecurityPlugin extends Plugin
  10. {
  11. //返回一个已存在的或新创建的acl列表
  12. public function getAcl()
  13. {
  14. if(!isset($this->persistent->acl)) {
  15.  
  16. $acl = new AclList();
  17. //设置默认访问级别为“拒绝”
  18. $acl->setDefaultAction(Acl::DENY);
  19.  
  20. //添加角色
  21. $roles = array(
  22. 'users' => new Role('Users'),
  23. 'guests' => new Role('Guests')
  24. );
  25. foreach($roles as $role) {
  26. $acl->addRole($role);
  27. }
  28.  
  29. //添加私有资源
  30. $privateResources = array(
  31. 'posts' => array('post'),
  32. 'comments' => array('comment')
  33. );
  34. foreach($privateResources as $resource => $actions) {
  35. $acl->addResource(new Resource($resource),$actions);
  36. }
  37.  
  38. //添加公有资源
  39. $publicResources = array(
  40. 'index' => array('index'),
  41. 'register' => array('index'),
  42. 'login' => array('index','start','end'),
  43. 'posts' => array('index','detail')
  44. );
  45. foreach($publicResources as $resource => $actions) {
  46. $acl->addResource(new Resource($resource),$actions);
  47. }
  48.  
  49. //公有资源访问控制
  50. foreach($roles as $role) {
  51. foreach($publicResources as $resource => $actions) {
  52. foreach($actions as $action) {
  53. $acl->allow($role->getName(),$resource,$action);
  54. }
  55. }
  56. }
  57.  
  58. //私有资源访问控制
  59. foreach($privateResources as $resource => $actions) {
  60. foreach($actions as $action) {
  61. $acl->allow('Users',$resource,$action);
  62. }
  63. }
  64. $this->persistent->acl = $acl;
  65. }
  66. return $this->persistent->acl;
  67. }
  68.  
  69. //查询acl列表进行权限控制
  70. public function beforeDispatch(Event $event,Dispatcher $dispatcher)
  71. {
  72. $auth = $this->session->get('auth');
  73. if(!$auth) { //查询当前用户的身份
  74. $role = 'Guests';
  75. } else {
  76. $role = 'Users';
  77. }
  78.  
  79. $controller = $dispatcher->getControllerName();
  80. $action = $dispatcher->getActionName();
  81.  
  82. $acl = $this->getAcl();
  83.  
  84. $allowed = $acl->isAllowed($role,$controller,$action);
  85.  
  86. if($allowed != Acl::ALLOW) { //需要用户登录才有权限
  87. $dispatcher->forward(array(
  88. 'controller' => 'login',
  89. 'action' => 'index'
  90. ));
  91. $this->session->destroy();
  92. return false;
  93. }
  94. }
  95. }
  96.  
  97. 在注入调度控制器时绑定到一个事件控制器中:
  98. $di->set('dispatcher',function() use ($di) {
  99.  
  100. $eventsManager = new EventsManager;
  101.  
  102. $eventsManager->attach('dispatch:beforeDispatch',new SecurityPlugin);
  103.  
  104. $dispatcher = new Dispatcher;
  105. $dispatcher->setEventsManager($eventsManager);
  106.  
  107. return $dispatcher;
  108. });

这样每次从一个方法跳转到另一个方法之前程序都会先去查询一下权限控制列表,看看用户对即将跳转的方法是否有访问权限,若没有权限则跳转到插件中指定的方法。

此外,还可以使用继承机制来构造更复杂的角色,只需要在添加角色的函数的第二个参数中写上要继承的那个角色的实例即可:

// 创建角色

$roleAdmins = new Role("Administrators", "Super-User role");

$roleGuests = new Role("Guests");

// 添加 "Guests" 到 ACL

$acl->addRole($roleGuests);

// 使Administrators继承Guests的访问权限

$acl->addRole($roleAdmins, $roleGuests);

为了提高性能, Phalcon\Acl 的实例可以被实例化到APC, session, 文本或数据库中:

// 保存实例化的数据到文本文件中

file_put_contents("app/security/acl.data", serialize($acl));

// 返序列化

$acl = unserialize(file_get_contents("app/security/acl.data"));

phalcon——访问控制列表ACL的更多相关文章

  1. 由于 web 服务器上此资源的访问控制列表(acl)配置或加密设置,您无权查看此目录或页面。

    场景:IIS中遇到无法预览的有关问题(HTTP 异常 401.3 - Unauthorized 由于 Web 服务器上此资源的访问控制列表(ACL)配置或加密设置 IIS中遇到无法预览的问题(HTTP ...

  2. 用访问控制列表(ACL)实现包过滤

      用访问控制列表(ACL)实现包过滤 一.ACL概述 1.ACL(Access Control List,访问控制列表)是用来实现数据包识别功能的 2.ACL可以应用于诸多方面 a>.b包过滤 ...

  3. 第10章 网络安全(5)_访问控制列表ACL

    6. 访问控制列表ACL 6.1 标准访问控制列表 (1)标准ACL ①标准ACL是基于IP数据包的源IP地址作为转发或是拒绝的条件.即,所有的条件都是基于源IP地址的. ②基本不允许或拒绝整个协议组 ...

  4. 基本的访问控制列表ACL配置

    摘要: 访问控制列表ACL (Access Control L ist)是由permit或 deny语句组成的一系列有顺序的规则集合,这些规则根据数据包的源地址.目的地址.源端口.目的端口等信息  来 ...

  5. HCNA Routing&Switching之访问控制列表ACL

    前文我们了解了DHCP服务相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15147870.html:今天我们来聊一聊访问控制列表ACL: ACL(ac ...

  6. 网络访问控制列表ACL(读懂这篇就基本够了,后面有配置案例)

    一.访问控制列表是什么? 访问控制列表(ACL)是一种基于包过滤的访问控制技术,它可以根据设定的条件对接口上的数据包进行过滤,允许其通过或丢弃.访问控制列表被广泛地应用于路由器和三层交换机,借助于访问 ...

  7. CCNA网络工程师学习进程(8)访问控制列表ACL

    前面几节我们介绍了路由器的路由配置,接下来几节我们将介绍路由器的高级配置应用,包括ACL.NAT.DHCP.PPP.VPN和远程连接等的配置.     (1)ACL概述:   ACL(Access C ...

  8. windows访问控制列表 --ACL(Access Control List)

    1.定义 ACL是一个windows中的表示用户(组)权限的列表. Access Control List(ACL) Access Control Entry(ACE) ... 2.分类 ACL分为两 ...

  9. Linux 系统访问控制列表ACL

    常见的文件系统的一般权限(rwx).特殊权限(SUID,SGID,STICK).隐藏权限(chattr)其实有个共性——权限是针对某一类用户设置的.而如果希望对某个指定的用户进行单独的权限控制,那么就 ...

随机推荐

  1. Spring详解(六)------AOP 注解

    上一篇博客我们讲解了 AspectJ 框架如何实现 AOP,然后具体的实现方式我们是通过 xml 来进行配置的.xml 方式思路清晰,便于理解,但是书写过于麻烦.这篇博客我们将用 注解 的方式来进行 ...

  2. Http协议基本知识简介

    HTTP协议是指超文本传输协议,位于应用层,HTTP规定数据格式,然后用tcp进行传输. 请求响应模式:简单理解为客户端对服务器发起请求,服务器响应客户端. 主要特点 无连接:无连接的含义是限制每次连 ...

  3. “AOP代理”遇到“双上下文”

    最近有小伙伴儿遇到了一个问题来咨询我,问题大致如下: 他在Service层利用Aspect设置了一个Spring AOP代理,在单元测试以及在service层代码上添加代理的时候均没有发现问题,但是在 ...

  4. JVM菜鸟进阶高手之路十一(eden survivor分配问题)

    转载请注明原创出处,谢谢! 问题 这个Xmn设置为1G,,我用jmap -heap 看,这个Eden From To怎么不是一个整8:1:1的关系呢? 我看内存分配还是没变,我Xmn1g,感觉From ...

  5. String类的常见面试题(3)

    1.判断定义为String类型的s1和s2是否相等 String s1 = "abc"; //这个"abc"对象首先会进常量池 String s2 = &quo ...

  6. 使用gc、objgraph干掉python内存泄露与循环引用!

    Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问 ...

  7. NOIP算法总结与复习

    NOIP算法总结与复习 (看了看李总的蓝皮书,收获颇多,记下此文,以明志--) (一)数论 1.最大公约数,最小公倍数 2.筛法球素数 3.mod规律公式 4.排列组合数,错排 5.Catalan数 ...

  8. Hex to Int 【十六进制转十进制】

    long HexToInt(char *msgline){    long strlength,chvalue,tvalue;    WORD i;    chvalue=0;    strlengt ...

  9. 【JVM】Java中的JavaCore/HeapDump文件及其分析方法

    产生时间 Java程序运行时,有时会产生JavaCore及HeapDump文件,它一般发生于Java程序遇到致命问题的情况下. 有时致命问题发生后,Java应用不会死掉,还能继续运行: 但有时致命问题 ...

  10. bzoj1968 COMMON 约数研究

    Input只有一行一个整数 N(0 < N < 1000000).Output只有一行输出,为整数M,即f(1)到f(N)的累加和.Sample Input 3 Sample Output ...