日期:2014-05-20 浏览次数:20849 次
啊!哈!咳!今天继续我们的ZF之旅。今天给大家将ACL的高级用法中的精细访问和移除控制规则,上一节是基本的介绍的ACL是对指定用户访问所有资源时设定的权限,这种设定并不一定能够满足实际应用的需要。例如,论坛中可能会有某个专区,只允许固定的用户发帖子,此时就要将涉及指定资源访问控制问题。
要为指定用户添加对指定资源的某种操作的允许或者拒绝权限时,只需要使用allow()或者deny()方法的第二个参数即可。这两种方法的第二个参数都表示相应的Resource(资源)类型,可以为Zend_Acl_Resource类的实例、字符串或者数组。
下边给大家一段我测试过的例子,例子是我经过测试后copy上来的,假设一个论坛包括3个大区,分别为娱乐区、技术区与管理区,不同的用户对各帖子访问的规则如下表:
用户角色 |
大区 |
浏览 |
发表 |
编辑 |
删除 |
其他 |
继承关系 |
Guest |
娱乐区 |
allow |
deny |
deny |
deny |
deny |
无 |
技术区 |
deny |
deny |
deny |
deny |
|||
管理区 |
deny |
deny |
deny |
deny |
|||
User |
娱乐区 |
allow |
allow |
allow |
deny |
deny |
从Guest继承 |
技术区 |
allow |
allow |
allow |
deny |
|||
管理区 |
allow |
deny |
deny |
deny |
|||
Moder |
娱乐区 |
allow |
allow |
allow |
allow |
deny |
从User继承 |
技术区 |
allow |
allow |
allow |
allow |
|||
管理区 |
allow |
allow |
allow |
deny |
|||
Administrator |
娱乐区 |
allow |
allow |
allow |
allow |
allow |
无 |
技术区 |
|||||||
管理区 |
测试代码(写到了控制器方法里):
$acl=new Zend_Acl();
//创建资源
$resouRelax=new Zend_Acl_Resource('relax'); //创建资源娱乐
$resouTech=new Zend_Acl_Resource('tech'); //创建资源技术
$resouAdmin=new Zend_Acl_Resource('admin'); //创建资源管理
$acl->add($resouRelax); //将资源添加到访问控制列表中
$acl->add($resouTech);
$acl->add($resouAdmin);
$roleGuest=new Zend_Acl_Role('guest'); //创建角色guest
$acl->addRole($roleGuest); //添加角色guest到访问控制列表
$acl->allow($roleGuest,$resouRelax,'view'); ///为guest添加在娱乐区的浏览权限
$acl->addRole(new Zend_Acl_Role('user'),$roleGuest); //创建user并继承guest,添加到user到访问控制列表
$acl->allow('user',null,array('view','create','edit')); //给user角色在所有资源中添加浏览、发表以及编辑
$acl->deny('user',$resouAdmin,array('create','edit')); //拒绝user在管理区发表、编辑
$acl->addRole(new Zend_Acl_Role('moder'),'user'); //创建moder并继承user,添加moder到访问控制列表
$acl->allow('moder',null,'delete'); //允许moder在所有资源进行删除
$acl->deny('moder',$resouAdmin,'delete'); //拒绝moder删除管理资源内容
$acl->addRole(new Zend_Acl_Role('administrator')); //创建administrator角色添加到访问控制列表,没有任何继承
$acl->allow('administrator'); //允许administrator的在所有资源的所有权限
$acl->removeDeny($roleGuest,$resouTech,'view'); //移除guest用户对技术资源的不能浏览权限,也就是允许guest对技术区有浏览权限
$acl->removeAllow('user',$resouTech,'edit'); //移除user对技术去的编辑权限,是user对技术区没有编辑权限
if ($acl->isAllowed($roleGuest,$resouRelax,'view'));
{
echo "guest 有娱乐区的浏览权限!";
}
也可以移除控制规则,也就是移除角色对指定资源的允许权限或禁止权限。上边的代码中的:
$acl->removeDeny($roleGuest,$resouTech,'view'); //移除guest用户对技术资源的不能浏览权限,也就是允许guest对技术区有浏览权限
$acl->removeAllow('user',$resouTech,'edit'); //移除user对技术去的编辑权限,是user对技术区没有编辑权限
这两段代码正是此意~!很简单我就不过多解释了~!