资源预览内容
第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
第9页 / 共14页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第1616章章 访问控制列表(访问控制列表(Zend_AclZend_Acl)访问控制列表(访问控制列表(ACL)是应用在路由器接口的指令列)是应用在路由器接口的指令列表。该指令列表用来告诉路由器哪些数据包可以接收、哪表。该指令列表用来告诉路由器哪些数据包可以接收、哪些数据包需要拒绝。至于数据包是被接收还是拒绝,可以些数据包需要拒绝。至于数据包是被接收还是拒绝,可以由类似于源地址、目的地址、端口号等的特定指示条件来由类似于源地址、目的地址、端口号等的特定指示条件来决定。使用决定。使用Zend Framework中的中的Zend_Acl组件即可实现完组件即可实现完整的访问控制。该组件提供了一整套实现访问控制列表整的访问控制。该组件提供了一整套实现访问控制列表(Access Control List)的解决方案。合理使用该类组件,)的解决方案。合理使用该类组件,可以实现用户所要求的访问控制。本章就来向读者介绍如可以实现用户所要求的访问控制。本章就来向读者介绍如何使用何使用Zend_Acl组件实现访问控制功能。组件实现访问控制功能。16.1 16.1 资源与角色资源与角色Zend_Acl组件中定义了两个重要的概念,即资源与角组件中定义了两个重要的概念,即资源与角色色(有一定权限的事物有一定权限的事物)。资源(。资源(Resource)是指一个被限)是指一个被限制访问的对象;角色(制访问的对象;角色(Role)则是指可以发出请求来访问)则是指可以发出请求来访问资源的对象。资源的对象。Zend_Acl组件中分别以组件中分别以Zend_Acl_Role类与类与Zend_Acl_Resource类来表示资源与角色。要创建角色与资类来表示资源与角色。要创建角色与资源只需要为这些类实例化对象即可。在实例化对象时,需源只需要为这些类实例化对象即可。在实例化对象时,需要为资源或者角色提供参数(详情请参见本章后面的实例要为资源或者角色提供参数(详情请参见本章后面的实例代码)。代码)。16.1.1 Zend_Acl16.1.1 Zend_Acl中的资源中的资源在在Zend_Acl中,资源就是所有被访问对象的统称。如中,资源就是所有被访问对象的统称。如论坛中的贴子、新闻管理系统中的新闻等都可以被看作是论坛中的贴子、新闻管理系统中的新闻等都可以被看作是资源。在资源。在Zend_Acl中,创建一个资源非常简单。中,创建一个资源非常简单。Zend_Acl提供了提供了Zend_Acl_Resource_Interface接口,该接口使开发接口,该接口使开发者可以非常方便的创建者可以非常方便的创建Resource。为了使。为了使Zend_Acl把某个把某个对象当作一个对象当作一个Resource,一个类只需要实现包含了一个方,一个类只需要实现包含了一个方法法getResourceId()的接口即可。另外,的接口即可。另外,Zend_Acl_Resource是一个包含在是一个包含在Zend_Acl里作为一个基本的里作为一个基本的Resource实现的实现的类,开发者可以任意对其进行扩展。类,开发者可以任意对其进行扩展。16.1.2 Zend_Acl16.1.2 Zend_Acl中的角色中的角色与资源相对应,在与资源相对应,在Zend_Acl中,角色就是所有进行访中,角色就是所有进行访问对象的统称。如论坛中的各种用户贴子、新闻管理系统问对象的统称。如论坛中的各种用户贴子、新闻管理系统中的新闻创建者与管理者等都可以被看作是角色。中的新闻创建者与管理者等都可以被看作是角色。Role(角色)与(角色)与Resource(资源)一样,其创建过程也非常简(资源)一样,其创建过程也非常简单。单。Zend_Acl提供了提供了Zend_Acl_Role_Interface接口方便开接口方便开发者创建发者创建Roles。为了使。为了使Zend_Acl把某个对象当作一个把某个对象当作一个Role,一个类只需要实现这个只包含了一个方法,一个类只需要实现这个只包含了一个方法getRoleId()的的接口。与接口。与Zend_Acl_Resource一样,一样,Zend_Acl_Role也是一也是一个包含在个包含在Zend_Acl里作为一个基本的里作为一个基本的Role实现的类。实现的类。16.2 16.2 创建并使用访问控制列表创建并使用访问控制列表在介绍完了资源与角色之后,本节就来介绍如何创建在介绍完了资源与角色之后,本节就来介绍如何创建并使用并使用ACL(访问控制列表)。通常这一使用过程包括以(访问控制列表)。通常这一使用过程包括以下几步:创建下几步:创建ACL、注册角色、定义访问控制以及查询、注册角色、定义访问控制以及查询ACL等。本节就这几步分别为读者作介绍。等。本节就这几步分别为读者作介绍。16.2.1 16.2.1 创建创建ACLACL从本章引言中对访问控制列表的定义可以看出,从本章引言中对访问控制列表的定义可以看出,ACL可以表示任何一组物理或虚拟对象。为了便于理解,这里可以表示任何一组物理或虚拟对象。为了便于理解,这里将创建一个基本的论坛(将创建一个基本的论坛(BBS)的)的ACL,该,该ACL将维护若将维护若干个等级的组。为创建一个新的干个等级的组。为创建一个新的ACL对象,可以使用对象,可以使用new关键字直接不带参数地实例化这个关键字直接不带参数地实例化这个ACL类。类。16.2.2 16.2.2 注册角色及定义访问控制注册角色及定义访问控制本节来介绍如何向已有的本节来介绍如何向已有的ACL中注册角色。要将指定中注册角色。要将指定的角色注册到访问控制列表中,可以使用访问控制列表实的角色注册到访问控制列表中,可以使用访问控制列表实例的例的addRole()方法,该方法的语法格式如下所示。方法,该方法的语法格式如下所示。addRole($role,$parentrole);allow($role,$resource,$privilege,$assert);deny($role,$resource,$privilege,$assert);论坛系统的用户通常需要一个分级的权限系统来决定论坛系统的用户通常需要一个分级的权限系统来决定其用户的授权能力。如,其用户的授权能力。如,“Guest”(未注册用户)组允许(未注册用户)组允许有查看的权限;有查看的权限;“User”(注册用户)有查看、发表、编(注册用户)有查看、发表、编辑的权限;辑的权限;“Moderator”(版主)组有查看、发表、编辑、(版主)组有查看、发表、编辑、删除等权限;而删除等权限;而“Administrator”(管理员)组的任务包(管理员)组的任务包括所有其他组的内容并包括敏感的信息、用户管理、后台括所有其他组的内容并包括敏感的信息、用户管理、后台配置数据和备份配置数据和备份/导出等。导出等。16.2.3 16.2.3 查询查询ACLACL状态状态使用使用ACL对象的对象的isAllowed()方法可以对指定角色是否方法可以对指定角色是否有指定权限进行查询。该方法将会根据指定角色是否有某有指定权限进行查询。该方法将会根据指定角色是否有某操作的权限而返回相应的布尔值。使用格式如以下代码所操作的权限而返回相应的布尔值。使用格式如以下代码所示。示。isAllowed($role,$resource,$privilege);以上代码中参数以上代码中参数$role为指定的角色,可以为角色类型、为指定的角色,可以为角色类型、字符串或者数组,默认为字符串或者数组,默认为null;$resource为指定的资源,为指定的资源,也可以为资源类型、字符串或者数组默认为也可以为资源类型、字符串或者数组默认为null,指所有资,指所有资源;参数源;参数$privilege为指定的权限,可以为字符串或者数组,为指定的权限,可以为字符串或者数组,默认的值为默认的值为null,指代所有权限。,指代所有权限。16.3 ACL16.3 ACL的高级用法的高级用法上一节所介绍的上一节所介绍的ACL访问控制只是访问控制只是ACL最基本的用法。最基本的用法。而实际应用中可能需要更加精密的访问控制、去除访问控而实际应用中可能需要更加精密的访问控制、去除访问控制列表中的某些规则、将控制列表中的信息进行存储以及制列表中的某些规则、将控制列表中的信息进行存储以及有条件的权限等更多高级的有条件的权限等更多高级的ACL操作。本节就来简要介绍操作。本节就来简要介绍所有这些所有这些ACL的高级用法。的高级用法。16.3.1 16.3.1 精细的访问控制精细的访问控制本章节中所介绍的本章节中所介绍的ACL是对指定用户访问所有资源时是对指定用户访问所有资源时设定的权限,这样的设定并不一定能满足实际应用的要求。设定的权限,这样的设定并不一定能满足实际应用的要求。如在论坛中可能会有某一个专区,只允许固定的用户发贴如在论坛中可能会有某一个专区,只允许固定的用户发贴子。这就牵涉到指定资源的访问控制问题。本节就来介绍子。这就牵涉到指定资源的访问控制问题。本节就来介绍下下ACL更精细的访问控制。更精细的访问控制。要为指定用户添加对指定的资源的某种操作的允许或要为指定用户添加对指定的资源的某种操作的允许或者拒绝权限时,只需要使用者拒绝权限时,只需要使用allow()或者或者deny()方法的第二个方法的第二个参数即可。这两种方法的第二个参数都表示相应的参数即可。这两种方法的第二个参数都表示相应的Resource(资源)类型,可以为(资源)类型,可以为Zend_Acl_Resource类的实类的实例或者是字符串或者数组。例或者是字符串或者数组。16.3.2 16.3.2 移除控制规则移除控制规则在使用在使用ACL时出于某种需要,可能需要对其中定义的时出于某种需要,可能需要对其中定义的控制规则进行移除。这时可以通过使用控制规则进行移除。这时可以通过使用ACL对象的对象的removeAllow()方法或者方法或者removeDeny()方法,将指定规则进行移除。这两方法,将指定规则进行移除。这两个方法的使用格式分别如以下代码所示。个方法的使用格式分别如以下代码所示。 removeAllow($role,$resource,$privilege);removeDeny($role,$resource,$privilege);16.3.3 16.3.3 存储存储ACLACL到各种载体到各种载体在在Zend Framework中中ACL被设计为可序列化(将对被设计为可序列化(将对象的状态信息转换为可以存储或传输的信息的过程)。因象的状态信息转换为可以存储或传输的信息的过程)。因此可以借用此可以借用PHP中的中的serialize()函数,将函数,将ACL对象中的内容对象中的内容进行序列化,将存储在其他载体中。在使用时,通过进行序列化,将存储在其他载体中。在使用时,通过PHP的的unseriailize()函数,将内容进行反序列化即可。这两个函函数,将内容进行反序列化即可。这两个函数的语法格式如以下代码所示。数的语法格式如以下代码所示。string serialize(mixed value)mixed unserialize(string str)16.3.4 16.3.4 有条件的访问规则有条件的访问规则在使用在使用ACL时,有时出于某种特殊的需要,可能需要时,有时出于某种特殊的需要,可能需要为访问规则设定相应的条件。如当普通用户的积分达到某为访问规则设定相应的条件。如当普通用户的积分达到某个条件时,就允许其在管理区发表内容;再如限制某些个条件时,就允许其在管理区发表内容;再如限制某些IP的用户对所有资源的访问等。这时就需要用到的用户对所有资源的访问等。这时就需要用到allow()方法方法的最后一个参数的最后一个参数$assert。该参数指代的是一个该参数指代的是一个Zend_Acl_Assert_Interface。在。在Zend_Acl中使用中使用Zend_Acl_Assert_Interface提供支持有条提供支持有条件的规则。为了使用规则声明接口,开发者写了一个实现件的规则。为了使用规则声明接口,开发者写了一个实现接口中接口中assert()方法的类。方法的类。16.4 16.4 小结小结本章为读者介绍了本章为读者介绍了Zend Framework中的中的Acl组件,使组件,使用用Zend_Acl可以实现不同用户对网络资源的访问控制。在可以实现不同用户对网络资源的访问控制。在实际使用的过程中需要注意,由于实际用户类型繁多,各实际使用的过程中需要注意,由于实际用户类型繁多,各种资源及操作权限也相当复杂。这时就需要为不同用户分种资源及操作权限也相当复杂。这时就需要为不同用户分配合理的权限,并且一定要对结果进行测试。因为基于用配合理的权限,并且一定要对结果进行测试。因为基于用户的继承关系,很可能出现各种关系的错乱,为系统运行户的继承关系,很可能出现各种关系的错乱,为系统运行造成不必要的麻场造成不必要的麻场
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号