Heim  >  Artikel  >  Backend-Entwicklung  >  phpGACL汉语手册(八)

phpGACL汉语手册(八)

WBOY
WBOYOriginal
2016-06-13 11:01:49833Durchsuche

phpGACL中文手册(八)

权限对象的命名

phpGACL系统用双关键字组合唯一标识每一个权限对象(AROAXOACO对象),并且它是权限对象类型。

它是用元组(权限对象类型,节,值)的形式来唯一标识权限对象的。

第一个元组元素是权限对象类型(AROAXOACO)。

元组的第二个元素叫节,它是由用户定义的命名权限对象通用类的字符串。多权限对象可以共享同一节名,节名很短但却是描述性的,它常被用在用户界面中的选择框中,因此不要它定义得太长。

节被保存在一个单位名称空间里,它不象组那样可以嵌套使用。节在组/ARO/AXO树中不做任何事,它仅仅只是为了帮助维护大量的权限对象。

元组的第三个元素叫值,是用户定义的权限对象名称,值中不能包含空格(而节可以)。

节和值都是大小写敏感的。

另:为什么用字符串来标识权限对象而不用看上去更快的整数呢,原因是为了易读性,从下例可以看出用

acl_check('system', 'login', 'users', 'john_doe');

比用:
acl_check(10, 21004, 15, 20304);
更容易理解。

因为通过上下文可以十分清楚我们所指定的权限对象类型,所以phpGACL(和本文档)在显示权限对象名时都去掉了权限对象类型而只需要采用"Section > Value"格式就成了。而在API中则要求权限对象的"节"和"值"必须要在函数参数中分别指定(权限对象类型在参数描述中通常是不明白指定的)

例如 ACO对象的"节>值"

  • "楼层>一楼"
  • "楼层>二楼"
  • "房间>发动机室"

例如 ARO对象的"节>值"

">John_Smith"

">Cathy_Jones"

"主机>sandbox.something.com"

例如 API的用法:

  • acl_check ( aco_section, aco_value, aro_section, aro_value);

  • acl_check ( 'Floors', '2nd', 'People', 'John_Smith' );

合法的命名限制实例:

  • "ACO -Frob > Flerg", "ARO - Frob > Flerg" (虽然节和值都相同,但这种命名是合法的,因为名称空间被权限对象类型给区分开了)
  • "ACO -Frob > Flerg", "ACO - Frob > Queegle" (虽然权限对象类型和节名都相同,但由于值名不同,所以该命名合法。
  • "AXO - Frob Hrung > Flerg" (节名可以包含空格)

不合法的命名限制实例:

  • "ACO - Frob > Flerg", "ACO - Frob > Flerg" ("权限对象类型-节名>值名"必须是唯一的)
  • "ACO - Frob > Flerg Habit" (值名中不能包含空格)

添加节

在你能添加一个新的权限对象之前,它的节名必须已经被添加。添加一个新的节名,可以使用add_object_section()函数。

简单描述该节的用处(如"Levels in building"

节名(如"Floor"

可以是一个任意的值,表示该节在用户界面上出现的次序

表示该节是否出现在用户界面中(如果是TRUE则意味着它将被隐藏)。

权限对象类型("aco", "aro" "axo"

HanARO对象创建 了三个节,它们分别是"人类","外星人"和"机器人"。让我们用它们的全名来列出ARO对象列表。缺省:全部拒绝
千年隼号乘客

├─
船员 [允许:全部]
│├─"
人类 > Han"
│├─"
外星人 > Chewie" [拒绝:发动机室]
│└─"
人类 > Lando"
├─
乘客 [允许:休息室 ]
│├─
绝地战士 [允许:驾驶室]
││├─"
人类 > Obi-wan"
││└─"
人类 > Luke" [允许:武器室]
│├─"
机器人 > R2D2" [允许:发动机室]
│└─"
机器人 > C3PO"
工程师 [允许:发动机室,武器室]
├─"
人类 > Han"
├─"
机器人 > R2D2"
└─"
外星人 > Hontook"

节仅仅只是一种权限对象的分类方式,以便使得用户界面更加友好,acl_check()代码更具可读性。它并不影响phpGACL决定对象的权限。它不能被嵌套(因此它不能在"人类"节下更创建一个"男人"子节,你将不得不创建一个类似叫做"Humans-Male"的节)

多目的

你也许需要用phpGACL来实现多个不同的目的。比方说,你也许需要限制用户访问网页的权限,并且还想限制远程主机访问你的服务器的权限。这两个任务之间并没有什么联系。

phpGACL能通过下面三种不同的方式来处理。

  • 可以在另一个数据库中保存权限表单。
  • 可以在同一数据库中用不同的权限表单来保存。(该功能并没有实现)
  • 你可以在同一个表单中保存权限对象的不同目的,并小心地管理你的列表以使它们不再冲突。

可以在创建一个新的phpGACL类时通过$gacl_options数组就可以实现选项1(当选项2可以实现时也一样),该数组允许你指定数据库和表单名的前缀。

$gacl_options = array(
'db_table_prefix' => 'gacl_',
'db_type' => 'mysql',
'db_host' => 'host1',
'db_user' => 'user',
'db_password' => 'passwd',
'db_name' => 'gacl');

?

$gacl_host1 = new gacl($gacl_options);

为了实现选项3,你必须要十分小心,因为phpGACL并不清楚你不同任务之间关系,因此有可能会生成无效的权限策略。

举个例子来说:Han想限制其他飞船同他飞船计算机之间的联系,此外还要限制到不同房间的权限。为了做到这一点,他也许要添加"LukeX型战斗机"作为远程飞船ARO对象(此外还可以添加其他飞机并且将飞船的计算机作为ACO对象)。因为所有ARO对象都在同一ARO树,因此创建一个APD就象"飞船 > LukeX型战斗机"[允许:"房间 > 发动机室"]一样,是完全没有意义的!为了帮助处理象这样的错误,好的节名能够使象这样的权限对象更加清楚。这对于任何管理员都是十分明显的:为一个飞船指定一个访问房间权限是没有任何意义的。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn