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

ZendFramework学习第三章(核心组件—访问控制列表ACL的创建并使用)

在写文章前提一下同学在周末反应的一个问题,同学告诉我说,他刚进公司,他的上级在他问问题的时候总是对他不予理睬 的鄙视,感觉自己很牛逼,在他面前很有位置,很不愿意把问题解释给他听,嫌他麻烦什么的。我要说的是,每个人都是从菜比走出来的,谁一开始不菜,在你菜的 时候问别人问题,如果他向你一样对待你现在的下级,你心里是否好受,自己会了就要好好解释给下级听,国家的未来是儿童,公司的未来不就是新员工么?公司的 辉煌在你这卡住了,没有续航能力的公司最终面临的也就是倒闭。所以说我希望每个公司都给新员工一些发展的余地和机会,太自私了不好。。下边继续我们的 ZF-------

对于ACL因为首次了解这东西,所以学习起来有难度。我认为对于 一个新的知识,好多都不需要你理解,记住就行了,对于知识点的了解无非就是对它的熟悉程度,和使用率。我在看不懂时也很着急,后来静下心来反复的阅读手册 和书,前边不理解的可能看到后边就会迎刃而解,用过一两次后就可以了。

本节将主要介绍如何创建并使用ACL(访问控制列表)。其主要过程为:

1.创建ACL

2.注册角色(比如在几个基本论坛中的Guestusermoder还有最牛逼的admin

3.定义访问控制(给角色分配权限,比如是否可以对资源删除、浏览什么)

4.查询ACL的状态(查出访问控制列表中的某个角色对资源是否可浏览、是否可删除)


 创建ACL

ACL可以表示任何一组物理或虚拟对象。为了便于理解,这里将创建一个基本的论坛BBSACL,该ACL将维护若干个等级的组。创建方法如下:

$acl=new Zend_Acl();

这里要注意的是:如果不定义任何访问权限,则默认的ACL将禁止所有的Role访问任何Resource


注册角色

要将指定的角色注册到访问控制列表中,可以使用访问控制列表实例的addRole()方法。该语法如下:

addRole($role,$parentrole)

其中,参数$role即为需要注册的角色,可以为角色、字符或者数组;可选参数$parentrole为参数$role所继承的父角色。


定义访问控制

为指定的注册角色添加允许权限可以使用ACL对象的allow()方法。方法如下:

allow($role,$resource,$privilege,$assert)

其 中,参数Role即为指定的角色,可以为角色、字符串或者数组;参数$resource为允许使用的资源,可以为资源、字符串或者数组,默认为 null(即为所有资源);参数$privilege为允许使用的权限,可以为字符串或者数组;关于参数$assert是要为访问规则设置相应的条件,例 如普通用户积分达到某个条件时可以在某管理区发表内容。

相应的也可以为角色添加拒绝权限,使用ACL对象中的deny()即可为角色添加拒绝权限:
deny($role,$resource,$privilege,$assert)

其中的参数意义与用法和allow()完全相同


下边给大家以常见的论坛系统用户等级为例来详细说明。

论 坛系统的用户通常需要一个分级的权限系统来决定其用户的授权。例如,“guest(未注册用户)组允许有查看的权限;“user(注册用户)组有查 看、发表、编辑的权限;“moder(版主)组有查看、发表、编辑、删除等权限;而“administrator(管理员)组的权限包括所有其他组的 权限以及敏感信息设置、用户管理、后台数据配置和备份/导出等。如下表:

用户角色

浏览

发表

编辑

删除

其他

继承关系

Guest

allow

deny

deny

deny

deny

User

allow

allow

allow

deny

deny

Guest继承

Moder

allow

allow

allow

allow

deny

User继承

Administrator

allow

allow

allow

allow

allow




下面通过实例演示:

        $acl=new Zend_Acl();                                                                    //实例化访问控制列表对象,此时ACL是禁止所有的role对任何Resource有任何权限的。
        $roleGuest=new Zend_Acl_Role('guest') ;                                //创建角色Guest
        $acl->addRole($roleGuest);                                                         //将对应的角色添加到访问控制列表中
        $acl->addRole(new Zend_Acl_Role('user'),$roleGuest);       // 创建User角色并继承Guest添加到访问控制列表
        $acl->addRole(new Zend_Acl_Role('moder'),'user');              //创建moder角色并继承user添加到访问控制列表
        $acl->addRole(new Zend_Acl_Role('administrator'));            //创建administrator角色没任何继承
        
        $acl->allow($roleGuest,null,'view');                                             //Guest添加浏览权限
        $acl->allow('user',null,array('create','edit'));                                //user添加发表和编辑权限,因已继承Guest角色所以user角色本身具有浏览权限
        $acl->allow('moder',null,'delete');                                                 //moder添加删除权限,因已经继承user所以本身具有浏览、发表和修改属性
        $acl->allow('administrator');                                                          //administrator添加所有权限


查询ACL的状态

使用ACL对象的isAllowed()方法可以对指定角色是否对指定权限进行查询,返回值为布尔值,语法如下:

isAllowed($role,$resource,$privilege)

其 中,参数$role为指定角色,可以为角色类型、字符串或者数组,默认值为null;参数$resource为指定的资源,可以为资源类型、字符串或者数 组,默认值为null,指所有资源;参数$privilege为指定的权限,可以为字符串或者数组,默认值为null,指代所有权限。

下边把上边代码修改添加上以下代码做演示:

        if ($acl->isAllowed($roleGuest,null,'view'))
        {
            echo "guest有浏览权限!";
            
        }
        else
        {
            echo "guest没有浏览权限!";
        }
        echo "<p>";
        if ($acl->isAllowed('user',null,'delete'))
        {
            echo "user对所有资源有删除权限!";
        }
        else
        {
            echo "user对所有资源没有删除权限!";
        }
        echo "<p>";

结果为:

guest有浏览权限!

user对所有资源没有删除权限!