日期:2014-05-20  浏览次数:20849 次

ZendFramework学习第三章(核心组件—ACL高级用法之精细访问控制、移除控制规则)

啊!哈!咳!今天继续我们的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对技术区没有编辑权限

这两段代码正是此意~!很简单我就不过多解释了~!