Zend Acl

来源:互联网 发布:单片机脉冲计数程序 编辑:程序博客网 时间:2024/06/05 17:00

ZendFramework作为PHP的一个官方编程框架,刚一推出来就引起了震动,大家把它简称为“ZF”。看来PHP已经在寻求向企业开发市场进军。但是由于推出时间短,熟悉ZF的开发人员,非凡是国内的程序员,对ZF了解的还不多。现在市面上还找不到一本专门介绍ZF的图书,现有的资料,大部分是英文版,Zend公司与中国公司合作翻译的ZendFrameWork中文手册,还是个烂尾工程,而且是1.0或1.2版本的,最新的ZF1.5.1资料更少。而用ZF全程编写的产品更是凤毛麟角。

有人说,ZF简直就是ROR的翻版,看来ZF应该具有当前流行的动态语言的优点,非凡是对MVC的良好支持,

了解ZF的人,应该对ZF的权限治理印象深刻。ZF手册在第一章的简介之后,第二章就拉出Zend_Acl(访问控制授权)来介绍,而第三章就是Zend_Auth的内容(认证)。从知识认知的顺序上,我个人感觉这样安排的不合适的。事实上第二和第三章的内容介绍,牵扯了众多后续章节的内容,我们不得不从第7章Zend_Controller开始看起。

但是不得不承认ZF的认证和授权是个优秀的设计。ZF的认证相对简单,我们可以直接连接数据库表,对用户输入的用户名和密码进行比较,确认当前用户的身份。还提供了摘要式认证等方法。而ACL(访问控制列表)提供的授权就很强大。

ACL提出了资源、角色、动作(访问)三个概念,用这些概念可以轻易构造一个强大的权限治理系统。而且权限治理可以细化到模块下的浏览、添加、删除、修改等细微动作。(ASP.NET只能控制到页面(模块)级别,更细致的控制需要程序员自己设计和实现)。这里粘一些代码,仅仅是说明一下(在IIS6.0 ZF1.51 Apache2.2下调试的):

//4种角色:admin,editor,guest,auditor,poweruser
//4种资源:channel,item,bbs,blog
//3种动作:view,edit,revise
//要求:
//admin对所有资源有所有权限
//guest对所有资源只有view权限
//editor对channel,item,bbs有view,edit权限
//auditor对channel,item,bbs,blog有revise权限
//poweruser继续editor,auditor权限

//定义角色
$acl=newZend_Acl();

$roleAdmin=newZend_Acl_Role('admin');
$acl->addRole($roleAdmin);
$roleEditor=newZend_Acl_Role('editor');
$acl->addRole($roleEditor);
$roleGuest=newZend_Acl_Role('guest');
$acl->addRole($roleGuest);
$roleAuditor=newZend_Acl_Role('auditor');
$acl->addRole($roleAuditor);
$rolePoweruser=newZend_Acl_Role('poweruser');
$acl->addRole($rolePoweruser,array('editor','auditor'));

//添加资源
$acl->add(newZend_Acl_Resource('channel'));
$acl->add(newZend_Acl_Resource('item'));
$acl->add(newZend_Acl_Resource('bbs'));
$acl->add(newZend_Acl_Resource('blog'));

//分配权限
//admin:
$acl->allow($roleAdmin,null,null);

//editor:
$acl->allow('editor',array('channel','item','bbs'),array('view','edit'));

//guest:
$acl->allow('guest',null,'view');

//auditor:
$acl->allow('auditor',array('channel','item','bbs','blog'),array('revise'));

//poweruser(从editor,auditor继续权限),可以再叠加另外的权限
//$acl->allow('poweruser',null,null);

//给所有角色分配权限(包括admin)
//$acl->allow(null,'','');
//$acl->deny(null,'','');

查看以上代码的最终权限,可以参考一下代码:

foreach(array('admin','editor','guest','auditor','poweruser')as$role)
{
echo'<br>'.'角色'.$role.'<br>';
echo'<tableborder=1>';
echo'<tr><tdalign=center>/</td><th>channel</th><th>item</th><th>bbs</th><th>blog</th></tr>';
foreach(array('view','edit','revise')as$right)
{
echo'<tr>';
echo'<th>'.$right.'</th>';
foreach(array('channel','item','bbs','blog')as$resource)
{
echo'<td>';
echo$acl->isAllowed($role,$resource,$right)?"allowed":"denied";
echo'</td>';
}
echo'</tr>';
}
echo'</table>';
}
}

这些资源、角色、动作,在以上代码片段里,是作为硬编码存在的,实际项目中,可以作为数据在数据库里保存。灵活应用就需要程序员的聪明了。

ZF的用户,只划分到“角色”这一级,也就是说,不能给某个用户直接分配权限。这肯定是出于简化设计而考虑的,否则设计和实现会复杂的多!这个有个小缺点,就是要为一个用户分配权限,必须首先建一个角色(相当于用户组),再把该用户加入到该角色下,通过角色来给该用户分配权限。而权限设计中,用户、角色、资源、动作的相互包含、交叉,其结果导致问题变得非常复杂!这么复杂的逻辑关系,不借助其他工具(例如计算机),人的大脑大多数情况下是很难想明白的。