3.3 权限机制

上面我们介绍了domain/node节点和相关的API,实际上在创建节点时是可以指定读写权限的,本节将详细介绍一下节点的权限机制。下面是创建node节点的代码:

  1. public ObjectBean create(String domain, String node, Serializable obj, AuthPolicy auth);

此时,可以指定一个权限参数,有只读(AuthPolicy.OP_READ)、读写(AuthPolicy.OP_READ_WRITE)、所有(AuthPolicy.OP_ALL)三种属性,默认为AuthPolicy.OP_ALL。

3.3 权限机制 - 图1注意

这里的权限属性是指创建进程对其他使用进程的权限约束,而不包括它自己。也就是对node的创建进程来说,它拥有对该node和domain所有操作权限(读写删,只要它不退出或者中止)。

假设现在创建了一个domain为d,node为n的节点,对于其他使用进程来说,操作权限如下所示:

3.3 权限机制 - 图2

从列表中可以发现,当创建进程指定node的权限为AuthPolicy.OP_ALL时,其他使用进程可以删除该node,但是不能删除其domain,这是为什么呢?

因为domain下通常还有其他node,它们的权限并不都是AuthPolicy.OP_ALL,比如还有一个n1的node权限为AuthPolicy.OP_READ,按照正常操作,该使用进程无法删除n1,假设它可以删除domain,那么它最后间接删除了n1,于是发生了悖论。因此,为了避免风险,所有的使用进程只能根据权限删除node,但是无法删除domain。

不过如果你允许承担这样的删除风险,也可以在创建进程里强行指定该domain可删除,通过在domain创建后,调用:

  1. public boolean setDeletable(String domain);

该方法只能被domain的创建进程调用,其他使用进程没有权限调用。

强行指定可删除后,其他进程可以直接删除该domain及所含node并忽略后果。

关于权限操作的例子详细参见3.6.4节“多节点权限操作示例”。