Phalcon在权限方面通过 Phalcon\Acl 提供了一个轻量级的 ACL(訪问控制列表). Access Control Lists (ACL) 同意系统对用户的訪问权限进行控制,比方同意訪问某些资源而不同意訪问其他资源等。 这里我们建议开发人员了解一些关于ACL的技术。

ACL有两部分组成即角色和资源。

资源即是ACL定义的权限所依附的对象。

角色即是ACL所字义的请求者的身份,ACL决定了角色对资源的訪问权限。同意訪问或拒绝訪问。

创建 ACL(Creating an ACL)¶

这个组件起先是设计工作在内存中的, 这样做提供了更高的訪问速度。 Phalcon\Acl 构造器的第一个參数用于设置取得ACL的方式。 以下是使用内存适配器的样例:

<?php $acl = new \Phalcon\Acl\Adapter\Memory();

默认情况下 Phalcon\Acl 同意我们訪问没有定义的资源中的action,为了提高安全性, 我们设置默认訪问级别为‘拒绝’。

<?php//设置默认訪问级别为拒绝
$acl->setDefaultAction(Phalcon\Acl::DENY);

加入角色(Adding Roles to the ACL)¶

角色即是权限的集合体,当中定义了我们对资源的訪问权限。 比如。 我们会把一个组织内的不同的人定义为不同的角色。 The Phalcon\Acl\Role 类使用一种更有组织的方式来定义角色。

这里我们创建一些角色:

<?php// 创建角色
$roleAdmins = new \Phalcon\Acl\Role("Administrators", "Super-User role");
$roleGuests = new \Phalcon\Acl\Role("Guests");//加入 "Guests" 角色到acl
$acl->addRole($roleGuests);//加入"Designers"到acl, 仅使用此字符串。
$acl->addRole("Designers");

上面我们看到,我们能够直接使用字符串来定义角色。

加入资源(Adding Resources)¶

资源即是訪问控制要控制的对象之中的一个。 正常情况下在mvc中资源通常是制器。 Phalcon中我们使用 Phalcon\Acl\Resource 来定义资源。 很重要的一点即是我们把相关的action或操作加入到资源中这样ACL才知道控制什么资源。

<?php// 定义 "Customers" 资源
$customersResource = new \Phalcon\Acl\Resource("Customers");// 为 "customers"资源加入一组操作
$acl->addResource($customersResource, "search");
$acl->addResource($customersResource, array("create", "update"));

定义訪问控制(Defining Access Controls)¶

至此我们定义了角色及资源, 如今是定义ACL的时候了,即是定义角色对资源的訪问。

这个部分是极其重要的,特别是在我们设定了默认的訪问级别后。

<?php// Set access level for roles into resources
$acl->allow("Guests", "Customers", "search");
$acl->allow("Guests", "Customers", "create");
$acl->deny("Guests", "Customers", "update");

allow()方法指定了同意角色对资源的訪问。 deny()方法则反之。

查询 ACL(Querying an ACL)¶

一旦訪问控制表定义之后, 我们就能够通过它来检查角色是否有訪问权限了。

<?php//查询角色是否有訪问权限
$acl->isAllowed("Guests", "Customers", "edit");   //Returns 0
$acl->isAllowed("Guests", "Customers", "search"); //Returns 1
$acl->isAllowed("Guests", "Customers", "create"); //Returns 1

角色继承(Roles Inheritance)¶

我们能够使用 Phalcon\Acl\Role 提供的继承机制来构造更复杂的角色。

Phalcon中的角色能够继承来自其他角色的 权限, 这样就能够实现更巧妙的资源訪问控制。

假设要继承权限用户, 我们须要在加入角色函数的第二个參数中写上要继承的那个角色实例。

<?php// 创建角色
$roleAdmins = new \Phalcon\Acl\Role("Administrators", "Super-User role");
$roleGuests = new \Phalcon\Acl\Role("Guests");// 加入 "Guests" 到 acl.
$acl->addRole($roleGuests);// 使Administrators继承Guests的訪问权限
$acl->addRole($roleAdmins, $roleGuests);

序列化 ACL 列表(Serializing ACL lists)¶

为了提高性能。 Phalcon\Acl 的实例能够被实例化到APC, session。 文本或数据库中, 这样开发人员就不须要反复的 定义acl了。 以下展示了怎样去做:

<?php//检查acl数据是否存在
if (!is_file("app/security/acl.data")) {$acl = new \Phalcon\Acl\Adapter\Memory();//... Define roles, resources, access, etc// 保存实例化的数据到文本文件里file_put_contents("app/security/acl.data", serialize($acl));} else {// 返序列化$acl = unserialize(file_get_contents("app/security/acl.data"));
}// 使用acl
if ($acl->isAllowed("Guests", "Customers", "edit")) {echo "Access granted!";
} else {echo "Access denied :(";
}

ACL 事件(ACL Events)¶

假设须要的话 Phalcon\Acl 能够发送事件到 EventsManager 。 这里我们为acl绑定事件。 当中一些事件的处理结果假设返回了false则表示正在处理的操作会被中止。 支持例如以下的事件:

事件名 触发条件 是否能中止操作
beforeCheckAccess 在权限检查之前触发 Yes
afterCheckAccess 在权限检查之后触发 No

以下的样例中展示了怎样绑定事件到此组件:

<?

php

//创建事件管理器 $eventsManager = new Phalcon\Events\Manager(); // 绑定事件类型为acl $eventsManager->attach("acl", function($event, $acl) { if ($event->getType() == "beforeCheckAccess") { echo $acl->getActiveRole(), $acl->getActiveResource(), $acl->getActiveAccess(); } }); $acl = new \Phalcon\Acl\Adapter\Memory(); //Setup the $acl //... // 绑定eventsManager到acl组件 $acl->setEventsManager($eventManagers);

自己定义适配器(Implementing your own adapters)¶

开发人员要创建自己的扩展或已存在适配器则须要实现此 Phalcon\Acl\AdapterInterface 接口。

Phalcon 訪问控制列表 ACL(Access Control Lists ACL)相关推荐

  1. ORA-24247: network access denied by access control list (ACL)

    Using UTL_SMTP to send email from your oracle database has changed in Oracle 11g. Or – to be more pr ...

  2. ccna 闫辉单臂路由 和 acl access control list

    ccna 闫辉单臂路由 和  acl   access control list 一单臂路由     当前园区网设计很少用到       成本低  小型的.局域网可用 二ACL access cont ...

  3. 记一次ORA-24247: network access denied by access control list (ACL)

    这两天在测试使用UTL_SMTP发送邮件时,遇到了ORA-24247的错误: Error report: ORA-24247: network access denied by access cont ...

  4. Nt/2000/xp平台下的存储控制模型(Access Control Model)

    鉴于在nt类操作系统下开发程序时有可能涉及操作注册表,读写文件和操控服务等内容,而为使这类程序在不同帐户下皆可正确运行就需要了解nt类操作系统的存储控制模型,所以才写这篇文章.这篇文章所涉及大部分内容 ...

  5. mysql访问控制列表acl_Linux访问控制列表(Access Control List,简称ACL)

    Linux访问控制列表(Access Control List,简称ACL) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ACL概述 ACL:Access Control L ...

  6. 缓存加速-----Squid-访问控制列表日志分析反向代理

    文章目录 一: ACL访问控制 1.1: ACL访问控制概述 1.2: ACL访问控制实验 二: Squid日志分析 三: 反向代理 3.1: 反向代理详解 3.2: 实验分析以及结构图 3.3: 具 ...

  7. [Nginx]用Nginx实现与应用结合的訪问控制 - 防盗链

    应用场景:图片等资源须要设置权限.如:仅仅有认证过的用户才干訪问自己的图片. 解决的方法:使用Nginx的防盗链模块http_secure_link能够实现,该模块默认情况下不包括.故在安装时要加上- ...

  8. C++ 訪问控制权限图解

    基类訪问权限 类继承方式 子类訪问权限           public   public   protected public protected   private   No Access   p ...

  9. 计算机网络实验报告访问控制列表,电子政务《计算机网络实验》期末报告 07-访问控制列表实验报告.doc...

    文档介绍: 计算机网络实验报告 1. 实验报告如有雷同,雷同各方当次实验成绩均以 0 分计. 2. 当次小组成员成绩只计学号.姓名登录在下表中的. 3. 在规定时间内未上交实验报告的, 不得以其他方式 ...

最新文章

  1. 设计模式之Dynamic Proxy-动态代理
  2. [转载]细说ASP.NET Windows身份认证
  3. 手把手教你将pyqt程序打包成exe(2)
  4. java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner
  5. c++中list容器
  6. 如何让自己的内心强大起来
  7. 安装 Android Studio 2.3 详细过程及错误解决
  8. Windows域策略 统一设置本地管理员密码 【全域策略生效】
  9. 21、方法的-、+符号
  10. 非极大值抑制(Non-max suppression)
  11. win7修复计算机无法修复工具栏,win7任务栏消失怎么办?win7任务栏消失的两种恢复方法...
  12. 初学者之路——————对抗神经网络
  13. Phaser用法详解
  14. 一代JS代码可以搞定机器自动刷票,投票页数据验证很重要
  15. GEEM2引擎微端架设基本教程
  16. 攻防世界逆向高手题之reverse-for-the-holy-grail-350
  17. Vue实现动态路由导航
  18. js逆向 事件点击找加密位置
  19. 未来网络什么样?新华三是这么说的
  20. 解决使用mp4v2封装的mp4文件在Wowza的hls上无法播放问题

热门文章

  1. 每日算法练习之括号配对
  2. phpstorm 提示请配置PHP解释器的解决办法
  3. 使用Scala-IDE构建Maven项目
  4. Oracle 优化器
  5. poj1861 最小生成树 prim amp; kruskal
  6. HTML5中的localStorage用法
  7. 浅谈javascript中的数据类型和引用类型
  8. c#的chart标题_C#中CHART画图
  9. 两边放动物对战守城的游戏_集合啦!动物森友会定制周边;百战天虫 大混战发布...
  10. harris角点检测_角点检测(2) - harris算子 - 理论与Python代码