人一生这一辈子,能记住多少事?还是写下来的好。 注册 | 登陆
浏览模式: 标准 | 列表分类:学术研究

关于Zend Acl的继承性及查询路径的研究

首先,我们有

三个角色,三个资源,

它们分别为:角色:a/b/c (a是b的父,b是c的父)

资源:A/B/C ( 同角色关系)

 

现在需要对它们进行研究。

 

试验一:继承优先级研究

首先,我们对a ~ A设置为真

得到以下的图:(以下图中双11的地方为我们设置的真,双0的地方为我们设置的假)

  A B C
a 11 1 1
b 1 1 1
c 1 1 1

接着,我们对b~B设置为假

得到的图:

  A B C
a 11 1 1
b 1 00 0
c 1 0 0

这时,我们就可以来验证是资源的继承性大于角色的继承性还是反过来的了。

i),我们设置c~A为真,

得到下图:

  A B C
a 11 1 1
b 1 00 0
c 11 0 0

 

ii),我们设置a~C为真,得到下图:

  A B C
a 11 1 11
b 1 00 1
c 1 0 1

 

从这两例中,我们来分析下,在i)中,很明显,B、C并未从A继承允许的权限,而在ii)中,a、c从a继承了权限。

即是说,角色的权限继承是优于资源的权限继承发生的

 

 

试验二:当资源树或角色树的根也是继承时,如何处理。

首先,我们来构建以下的表格: 

  A B C
a 0 0 0
b 0 11 1
c 0 1 1

需要构建这样的表格,只需要b~B设置为真,其它的不做设置即可。

i) 我们设置b~A为假,得到以下表格:

  A B C
a 0 0 0
b 00 11 1
c 0 1 1

ii) 我们设置b~A为真,得到以下表格:

  A B C
a 0 0 0
b 11 11 1
c 1 1 1

iii)我们设置a~B为假,得到以下表格:

  A B C
a 0 00 0
b 0 11 1
c 0 1 1

 iv)我们设置a~B为真,得到以下表格:

  A B C
a 0 11 1
b 0 11 1
c 0 1 1

v)我们设置c~A为假,得到以下表格:

  A B C
a 0 0 0
b 0 11 1
c 00 1 1

vi)我们设置a~C为假,得到以下表格:

  A B C
a 0 0 00
b 0 11 0
c 0 1 0

 vii)我们设置c~B为假,得到以下表格:

  A B C
a 0 0 0
b 0 11 1
c 0 00 0

viii)我们设置b~C为假,得到以下表格:

  A B C
a 0 0 0
b 0 11 00
c 0 1 0

 

从以上八例中,得到如下结论:

下一级角色的权限在未指明时,为上一级角色的权限的一个副本。所以查询过程为:

 

执行步骤
  1. 初始化:[角色] = c ,[资源] = C    
  2. 检查 [角色] ~ [资源] 是否被设置权限,若被设置,则返回此权限。    
  3. 检查[资源]的父资源,若存在,则将[资源]设置为它的父资源,然后执行 步骤2;若不存在,则继续执行 步骤4      
  4. [资源] = C , 获取[角色]的父角色,若存在,则将[角色]设置为它的父角色,然后执行步骤2;若不存在,则返回deny      

Tags: zend, acl, 校验路径