ACL 是如何工作的

来源:互联网 发布:贝丽花园淘宝店 编辑:程序博客网 时间:2024/04/29 16:53

ACL(Access control lists)是一种细粒度,易维护和易管理的管理程序权限的方式。
ACL主要处理两方面内容:一个是发起资源请求的对象,一个是希望获取的资源。
请求使用资源的对象称作请求访问对象,简称为 ARO(access request object)。
希望获取的资源被称作访问控制对象,简称为 ACO(access control object)。
有时候发起请求的并不是用户本身,在这种情况下,可能希望限制某些特定的 controller的访问权限,而这些controller又不得不在应用程序的其他位置初始化逻辑。
ACO 可以是任何希望进行访问控制的对象,从controller到action到一个web服务接口。
ACL 是用来定义 ARO 什么时候可以访问一个 ACO。
ACL 不是一个用来验证用户合法性的系统,只有系统知道了用户是谁以后,ACL 才开始发挥作用。
ACL 是采用树状结构来实现的,通常 ARO一棵树,ACO一棵树。使用树状结构来组织对象,权限仍然可以是细粒度的,而且同时可以对大局有很好的把握。

定义权限:基于ini文件的 ACL
Cake 中第一种 ACL 实现是基于 ini 文件的。建议只在非常简单或者因为某些原因不能使用数据库的情况下使用基于 ini 的ACL 方案。
ARO/ACO 权限设定保存在/app/config/acl.ini.php 文件中。

定义权限:基于数据库的 ACL
默认的 ACL 方案是保存在数据库中的。
dbACL 由一组核心 model 和一个命令行脚本组成。Model 用来和数据库交互以保存和获取 ACL 树。而命令行脚本可以用来创建数据库。
在/cake/scripts/ 目录下执行命令:
$ php acl.php initdb

创建 ARO 和 ACO
有两种方式用来引用 ARO或者 ACO。一种是给它们一个ID,通常是他们对应的表的主键ID。另一种是给他们一个字符串别名。
在Aro model中定义了创建新的ARO对象的方法:create()。
这个方法有3个参数:$link_id $parent_id $alias。
这个方法创建一个由 $parent_id 指定的父对象之下的 ACL 对象,如果传入的 $parent_di 为null,则作为一个根对象。$link_id 允许将当前用户对象连接到 Cake 的ACL结构。$alias 允许放入一个非整型ID的对象。
在能够创建ACO和ARO之前,需要加载这些类。实现加载的最简单方法是使用 $components 数组,并将Cake ACL 组件包含在Controller里:
var $components = array('Acl');

分配权限
class SomethingsController extends AppController
{
 var $components = array("Acl");

 function someAction()
 {
  $this->Acl->allow('Jimi Hendrix', 'Electric Guitar');
  $this->Acl->allow('Bob Marley', 'Electric Guitar');
  $this->Acl->allow('Presidents', 'United States Army');
 }
}

校验权限:ACL Component
校验权限是ACL中最简单的部分:只需要使用 ACL Component 中的check()函数。