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 ...
随机推荐
- js中OOP小指南
js中OOP小指南 在指南中,我将尝试解析以面向对象规范聚焦的es6的新特性. 首先, 什么是设计模式 范例是某个事务的例子或模型,在某种情况下,按照一种模式创建了计算机程序. 什么是面向对象 显然你 ...
- 【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
转自:http://www.cnblogs.com/kevince/p/3887827.html 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这么一说大家心里肯定有数了吧,“不就是nex ...
- 洛谷 P1012 拼数 [字符串]
题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4 ...
- 15、Django实战第15天:我要学习咨询
今天完成的是课程机构列表页面的最后一个模块:我要学习 我们在models中创建对应的表时UserAsk.之前我们讲过:在做表单的时候,我们可以通过forms先对提交的数据做验证,之前我们使用的是For ...
- ASP.NET Core 2.2 基础知识(十六) SignalR 概述
我一直觉得学习的最好方法就是先让程序能够正常运行,才去学习他的原理,剖析他的细节. 就好像这个图: 所以,我们先跟着官方文档,创建一个 SignalR 应用: https://docs.microso ...
- 【扩展欧几里得】poj2115 C Looooops
题意大概是让你求(A+Cx) mod 2^k = B的最小非负整数解. 若(B-A) mod gcd(C,2^k) = 0,就有解,否则无解. 式子可以化成Cx + 2^k*y = B - A,可以用 ...
- 【莫队算法】【权值分块】bzoj2223 [Coci 2009]PATULJCI
不带修改主席树裸题<=>莫队+权值分块裸题. 复杂度O(m*sqrt(n)). P.S.题目描述坑爹,第二个数是权值的范围. #include<cstdio> #include ...
- 5.10(java学习笔记)容器的同步控制与只读设置
1.容器的同步控制 像我们平常使用的容器有些是不同步的即线程不安全,例如HashMap等,在多线程时可能出现并发问题. 而有些容器又是同步的,例如Hashtable. 有些时候我们需要将这些不同步的容 ...
- 工作流Activiti新手入门学习路线整理
写在前面: 最近项目中使用到了工作流,虽然此部分不是自己需要完成的,但是也涉及到了要调用写的接口.正好有时间,就了解下,以便之后能在其他项目中用到时,不至于什么都不知道什么都不了解. 这里就主要整理下 ...
- Java高级架构师(一)第03节:多模块多Web应用合并War包
多模块.多Web应用合并war包 在日常的系统开发中,如果担心各个系统的资源同名覆盖,可以在总的War模块下放置一份最终的资源. 将版本号改成9.1.0.v20131115,ok 在Idea中的Mav ...