解决冲突如果我们把chewie加入到工程师组中会出现什么情况呢? 缺省:全部拒绝
千年隼号乘客
├─船员 [允许:全部]
│├─han
│├─chewie [拒绝:发动机室]
│└─lando
├─乘客 [允许:休息室 ]
│├─绝地战士 [允许:驾驶室]
││├─obi-wan
││└─luke [允许:武器室]
│├─r2d2 [允许:发动机室]
│└─c3po
└─工程师 [允许:发动机室,武器室]
├─han
├─r2d2
├─hontook
└─chewie
这就使chewie到发动机室的权限产生了歧义,因为从根沿树遍历到chewie出现两条路径。如果飞船的计算机沿其中一条路径(船员路径),将得到拒绝进入发动机室的结论。而沿另一条路径(工程师路径)则会得到允许进入发动机室的结论,那么他到底有没权进入发动机室呢?
当你添加或编辑分属多组的aro对象使之对某个aco对象的权限发生歧义时,phpgacl系统将警告你。但它会最近优先以便解决冲突。
如果我们现在问phpgaclchewie有权进入发动机室吗?那么返回的结果是最近acl被修改的内容(这是phpgacl的策略)。在上面这个例子中,返回的结果是允许,因为被工程师组指定的允许:发动机室,武器室权限的时间要比被船员组指定的拒绝:发动机室权限时间要近。
当有歧义的权限设定在acl列表中存在时,该acl列表被称为不一致。不一致的acl列表是非常危险的,如果你允许你的acl列表保持在这种状况下的话,你可能会在不经意之下把权限赋给不恰当的人。当phpgacl警告你acl列表不一致时,最好还是去解决冲突以尽可能恢复其一致性。
为解决上例的冲突,我们可以作以下任何一步:
删除在船员组中chewie的拒绝:发动机室指令添加在工程师组中chewie的拒绝:发动机室指令在工程师组中删除chewie,因为han无论如何不认为他作工程师是一件值得考虑的事han选了第三种方案,将chewie从工程师组中删除
