Phalcon 訪问控制列表 ACL(Access Control Lists ACL)
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)的更多相关文章
- ORA-24247: 网络訪问被訪问控制列表 (ACL) 拒绝
ORA-24247: 网络訪问被訪问控制列表 (ACL) 拒绝 注意:须要在system用户下使用命令 须要先使用 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL 创建訪问控 ...
- [笔记] Access Control Lists (ACL) 学习笔记汇总
一直不太明白Windows的ACL是怎么回事,还是静下心来看一手的MSDN吧. [翻译] Access Control Lists [翻译] How Access Check Works Modify ...
- zookeeper ACL(access control lists)权限控制
基本作用: 针对节点可以设置 相关读写等权限,目的为了保障数据安全性 权限permissions可以制定不同的权限范围以及角色 一:ACL构成 zk的acl ...
- IIS中遇到无法预览的问题(HTTP 错误 401.3 - Unauthorized 因为 Web server上此资源的訪问控制列表(ACL)配置或加密设置,您无权查看此文件夹或页面。)
在IIS中 依次运行例如以下操作: 站点--编辑权限--共享(为了方便能够直接将分享对象设置为everyone)--安全(直接勾选 everyone )--应用--确定.
- windows访问控制列表 --ACL(Access Control List)
1.定义 ACL是一个windows中的表示用户(组)权限的列表. Access Control List(ACL) Access Control Entry(ACE) ... 2.分类 ACL分为两 ...
- Linux访问控制列表(Access Control List,简称ACL)
Linux访问控制列表(Access Control List,简称ACL) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ACL概述 ACL:Access Control L ...
- Oracle ACL(Access Control List)
在oralce 11g中假如你想获取server的ip或者hostname,执行如下语句 SELECT utl_inaddr.get_host_address FROM dual; //获取IP S ...
- ACL(Access Control List)
一.ACL的简介 ACL(Access Control List 访问控制列表)是路由器和交换机接口的指令列表,用来控制端口进出的数据包.ACL的定义也是基于每一种被动路由协议的,且适用于所有的被动路 ...
- 訪问控制 protected, public, private 对照
OOP 3大特性:数据抽象,继承,动态绑定 3中訪问标号 protected, public, private 对照 用类进行数据抽象:用继承类继承基类的成员,实现继承.通过将基类对应函数声明为vir ...
随机推荐
- PHP实现支付宝即时到账功能
本文实例为大家分享了PHP支付宝即时到账功能的实现代码,供大家参考,具体内容如下 首先需要下载即时到账交易接口,传送门https://doc.open.alipay.com/doc2/detail?t ...
- 解决windows下文件拷贝到ubuntu下文件名乱码的问题
sudo apt-get install convmv 解压zip文件: convmv -f gbk -t utf8 -r --notest *
- openssl生成证书链多级证书
操作系统CentOS6.6 注:windows版本的Openssl无法做这个实验,由于所有编译的window版本openssl没有对openssl目录重新定向,导致在windows下找不到pki目录 ...
- 蒟蒻的9个背包的浩大工程(更新中)(无限延期)(太长了不舍删虽然写的lj的一匹)
所以说这就是一篇写炸的废文!!!! 所以说背包直接看dd大神的就好了,算了瞎写写吧. 0/1背包 有n件物品和一个容量为C的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品放入背包可使 ...
- Codeforces 855C - Helga Hufflepuff's Cup
855C - Helga Hufflepuff's Cup 题意 要求构建一棵树,树上至多可以存在 \(x\) 个权值为 \(k\) 的重要点,且与重要点连边的点的权值必须小于 \(k\),问有多少种 ...
- decode and CASE
CASE
- vc ini配置文件读写
ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息.ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Ke ...
- [SourceTree]--记录Win10 安装SourceTree免注册登陆
记录SourceTree一次安装不成功的过程及解决办法 SourceTree简介 按照官网介绍:SourceTree是一款用于Windows和Mac的免费Git客户端.简化了用户与Git存储(仓)库的 ...
- 英尺和米之间的转换 Exercise06_09
/** * @author 冰樱梦 * 时间:2018年下半年 * 题目:英尺和米之间的转换 * */ public class Exercise06_09 { public static void ...
- mysql获取分类数量
1.sql <select id="getTypeNum" resultType="TypeNum" > select count(*) as al ...