时间:2021-07-01 10:21:17 帮助过:14人阅读
默认情况下 Phalcon\Acl 同意我们訪问没有定义的资源中的action,为了提高安全性, 我们设置默认訪问级别为‘拒绝’。
<?php //设置默认訪问级别为拒绝 $acl->setDefaultAction(Phalcon\Acl::DENY);
角色即是权限的集合体,当中定义了我们对资源的訪问权限。 比如。 我们会把一个组织内的不同的人定义为不同的角色。 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");
上面我们看到,我们能够直接使用字符串来定义角色。
资源即是訪问控制要控制的对象之中的一个。 正常情况下在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"));
至此我们定义了角色及资源, 如今是定义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()方法则反之。
一旦訪问控制表定义之后, 我们就能够通过它来检查角色是否有訪问权限了。
<?php //查询角色是否有訪问权限 $acl->isAllowed("Guests", "Customers", "edit"); //Returns 0 $acl->isAllowed("Guests", "Customers", "search"); //Returns 1 $acl->isAllowed("Guests", "Customers", "create"); //Returns 1
我们能够使用 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);
为了提高性能。 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 :("; }
假设须要的话 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);
开发人员要创建自己的扩展或已存在适配器则须要实现此 Phalcon\Acl\AdapterInterface 接口。
Phalcon 訪问控制列表 ACL(Access Control Lists ACL)
标签:before turn 指定 问控制 active sre 提高 通过 bottom