日期:2014-05-20 浏览次数:20852 次
在写文章前提一下同学在周末反应的一个问题,同学告诉我说,他刚进公司,他的上级在他问问题的时候总是对他不予理睬 的鄙视,感觉自己很牛逼,在他面前很有位置,很不愿意把问题解释给他听,嫌他麻烦什么的。我要说的是,每个人都是从菜比走出来的,谁一开始不菜,在你菜的 时候问别人问题,如果他向你一样对待你现在的下级,你心里是否好受,自己会了就要好好解释给下级听,国家的未来是儿童,公司的未来不就是新员工么?公司的 辉煌在你这卡住了,没有续航能力的公司最终面临的也就是倒闭。所以说我希望每个公司都给新员工一些发展的余地和机会,太自私了不好。。下边继续我们的 ZF-------
对于ACL因为首次了解这东西,所以学习起来有难度。我认为对于 一个新的知识,好多都不需要你理解,记住就行了,对于知识点的了解无非就是对它的熟悉程度,和使用率。我在看不懂时也很着急,后来静下心来反复的阅读手册 和书,前边不理解的可能看到后边就会迎刃而解,用过一两次后就可以了。
本节将主要介绍如何创建并使用ACL(访问控制列表)。其主要过程为:
1.创建ACL
2.注册角色(比如在几个基本论坛中的Guest、user、moder还有最牛逼的admin)
3.定义访问控制(给角色分配权限,比如是否可以对资源删除、浏览什么)
4.查询ACL的状态(查出访问控制列表中的某个角色对资源是否可浏览、是否可删除)
创建ACL
ACL可以表示任何一组物理或虚拟对象。为了便于理解,这里将创建一个基本的论坛BBS的ACL,该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对所有资源没有删除权限!