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 接口。

时间: 2024-12-23 18:27:41

Phalcon 訪问控制列表 ACL(Access Control Lists ACL)的相关文章

Phalcon 访问控制列表 ACL(Access Control Lists ACL)

Phalcon在权限方面通过 Phalcon\Acl 提供了一个轻量级的 ACL(访问控制列表). Access Control Lists (ACL) 允许系统对用户的访问权限进行控制,比如允许访问某些资源而不允许访问其它资源等. 这里我们建议开发者了解一些关于ACL的技术. ACL有两部分组成即角色和资源. 资源即是ACL定义的权限所依附的对象. 角色即是ACL所字义的请求者的身份,ACL决定了角色对资源的访问权限,允许访问或拒绝访问. 创建 ACL(Creating an ACL)? 这个

[kernel]access control lists(ACL)

一. 为什么要使用ACL 先让我们来简单地复习一下Linux的文件权限. 在 linux下,对一个文件(或者资源)可以进行操作的对象被分为三类: file owner(文件的拥有者),group(组,注意不一定是文件拥有者所在的组), other (其他)而对于每一类别又分别定义了read, write and execute/search 权限 (这里不讨论SUID, SGID以及Sticky bit的设置)通过ls -l命令就我们就可以列出一个文件的权限 代码: [[email protec

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

一直不太明白Windows的ACL是怎么回事,还是静下心来看一手的MSDN吧. [翻译] Access Control Lists [翻译] How Access Check Works Modifying the ACLs of an Object in C++ Understanding Windows File And Registry Permissions Registry Key Security and Access Rights Well-known security ident

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

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

CCNP路由实验之十四 路由器的訪问控制ACL

?? ACL(Access Control List,訪问控制列表) 是路由器接口的指令列表,用来控制port进出的数据包.ACL适用于全部的路由协议,如IP.IPX.AppleTalk等.这张表中包括了匹配关系.条件和查询语句,表仅仅是一个框架结构.其目的是为了对某种訪问进行控制.訪问控制列表使用包过滤技术,在路由器上读取第三层及第四层包头中的信息如源地址,目的地址,源port.目的port等,依据预先定义好的规则对包进行过滤.从而达到訪问控制的目的,该技术初期仅在路由器上支持.如今已经支持三

Oracle ACL (Access Control List)详解

在Oracle11g中,Oracle在安全方面有了很多的改进,而在网络权限控制方面,也有一个新的概念提出来,叫做ACL(Access Control List), 这是一种细粒度的权限控制.在ACL之前,我们对于有一些程序包,例如UTL_MAIL, UTL_SMTP等这些包,你可以利用这些包连接到外部的主机,而默认情况下,这些包都是都是赋予了public角色,所以可能会导致利用这些PL/SQL程序包的恶意工具,所以Oracle提出了一个新的概念来解决这个问题,那就是ACL. 在开始展开ACL之前

Oracle R12 多组织访问的控制 - MOAC(Multi-Org Access Control)

Oracle R12 多组织访问的控制 - MOAC(Multi-Org Access Control) MOAC(Multi-Org Access Control)为多组织访问控制,是Oracle EBS R12的重要新功能,它可以实现在一个Responsibility下对多个Operation Unit(OU)进行操作.MOAC允许用户在不切换responsibility的情况下,在一个responsibility下处理多个OU组织的事务. 这里拿一个应用场景来说明: 某集团公司下边主要分为

C++类訪问控制及继承

一.C++类的訪问控制有三类:public,protected和private. 类訪问控制符 类成员可被哪些对象訪问 public 1.类的成员函数.2.类对象.3.友元.4.子类成员函数 protected 1.类的成员函数.2.友元.3.子类成员函数 private 1.类的成员函数.2.友元 二.C++类的继承 继承方式也有三种:public,protected和private. 继承之后,基类成员的可訪问性会发生变化,例如以下表: public继承 基类 public protecte

JAVA基础之訪问控制权限(封装)

包:库单元 1.当编写一个Java源码文件时.此文件通常被称为编译单元(有时也被称为转译单元). 2.每一个编译单元都必须有一个后缀名.java,而在编译单元内则能够有一个public类,该类名称必须和文件的名称同样. 3.每一个编译单元仅仅能有一个public类,否则编译器就不会接受. 4.假设在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,由于它们不是public类. 代码组织 xx.java编译生成xx.class package语句必须是文件除凝视以外的第一句程序