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: 网络訪问被訪问控制列表 (ACL) 拒绝

     ORA-24247: 网络訪问被訪问控制列表 (ACL) 拒绝 注意:须要在system用户下使用命令 须要先使用 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL 创建訪问控 ...

  2. [笔记] Access Control Lists (ACL) 学习笔记汇总

    一直不太明白Windows的ACL是怎么回事,还是静下心来看一手的MSDN吧. [翻译] Access Control Lists [翻译] How Access Check Works Modify ...

  3. zookeeper ACL(access control lists)权限控制

    基本作用:        针对节点可以设置 相关读写等权限,目的为了保障数据安全性        权限permissions可以制定不同的权限范围以及角色 一:ACL构成         zk的acl ...

  4. IIS中遇到无法预览的问题(HTTP 错误 401.3 - Unauthorized 因为 Web server上此资源的訪问控制列表(ACL)配置或加密设置,您无权查看此文件夹或页面。)

    在IIS中  依次运行例如以下操作: 站点--编辑权限--共享(为了方便能够直接将分享对象设置为everyone)--安全(直接勾选 everyone )--应用--确定.

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

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

  6. Linux访问控制列表(Access Control List,简称ACL)

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

  7. Oracle ACL(Access Control List)

    在oralce 11g中假如你想获取server的ip或者hostname,执行如下语句 SELECT utl_inaddr.get_host_address FROM dual;  //获取IP S ...

  8. ACL(Access Control List)

    一.ACL的简介 ACL(Access Control List 访问控制列表)是路由器和交换机接口的指令列表,用来控制端口进出的数据包.ACL的定义也是基于每一种被动路由协议的,且适用于所有的被动路 ...

  9. 訪问控制 protected, public, private 对照

    OOP 3大特性:数据抽象,继承,动态绑定 3中訪问标号 protected, public, private 对照 用类进行数据抽象:用继承类继承基类的成员,实现继承.通过将基类对应函数声明为vir ...

随机推荐

  1. [centos6.5] 把xampp的htdocs改为其他目录

    vim /opt/lampp/etc/httpd.conf DocumentRoot "/opt/lampp/htdocs" 改为 DocumentRoot "/var/ ...

  2. POJ 2407.Relatives-欧拉函数O(sqrt(n))

    欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. 对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn. Euler函数表达通式:euler(x)=x(1 ...

  3. JavaScript防止重复提交表单

    往往有些用户网络慢或者其他问题,在提交表单的时候使劲点击保存提交按钮,在提交表单的时候加上下面的代码,即可以限制在一定时间内,只有一次点击是有效的. <script> var mypret ...

  4. CSS 从入门到放弃系列:CSS的选择器和优先级

    CSS的选择器和优先级 CSS的N种选择器 !important 其实这个玩意不算什么选择器,放在这只是为了突出这个选择器优先级或者说权重的从高到低而已.. 内联方式(行间样式) <div st ...

  5. 线段树维护矩阵【CF718C】 Sasha and Array

    Description 有一个长为\(n\)的数列\(a_{1},a_{2}...a_{n}\),你需要对这个数列维护如下两种操作: \(1\space l \space r\space x\) 表示 ...

  6. CentOS 7 下Ansiable搭建命令列表 及常用监控指令

    根据文章 [  自动化运维工具Ansible详细部署 ] 搭建 ============================================================== 1.Ans ...

  7. POJ 3537 Crosses and Crosses (NEERC)

                      Crosses and Crosses Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 4 ...

  8. 【字符串哈希】【BKDRhash】【Rabin-Karp算法】模板

    #include<cstdio> #include<iostream> #include<cstring> #include<string> #incl ...

  9. 3.2常用类(java学习笔记)String与StringBuffer

    一.String String又称不可变字符序列. 我们看JDK源码中用于字符存储的数组有final修饰,final修饰变量就代表变量不能改变. 我们可以看API文档中对String的描述. Stri ...

  10. Android Studio 下使用git -- 个人,本地版本控制

    第一步:下载安装git 下载地址 : https://git-scm.com/downloads 第二步:Android Studio 下配置git路径. 配置之后,Test弹出如下成功的提示即可. ...