一直以来对于Acegi实现Domain Object Instance的权限控制就比较感兴趣,今天抽空大致的看了一下,感觉和我以前提出的数据权限那部分的实现是大致相同的。
Acegi在Domain Object Instance上采用的是ACL的实现,ACL在实现实例级别的权限控制上确实是非常好的方法,按照ACL的思想我们很容易知道Domain Object Instance的控制需要的是user--->Domain Object Instance的一个列表的维护,这点在Acegi上可以看到采用的就是通过acl_object_identity以及acl_permission这两张表来实现的,看acl_object_identity表惊喜的发现acegi也是考虑到了domain object instance的权限继承的实现的,acl_object_identity记录的是需要控制权限的domain object instance的相关信息,acl_permission记录的即为用户对于domain object instance的权限,Acegi做到的其实就是将这些通用的部分做了一个实现,在存储domain object时它帮忙做了相关的权限信息的存储,应该说acegi这样的实现确实是可以做到domain object instance的权限控制,不过感觉在acegi中要去实现对象实例级权限控制还是不那么的方便,配置起来非常的繁琐,应该基于它做一级提升,在易用性方面。
而且这种做法在侵入性上仍然是无法避免的,比如需要分页获取数据时,必然是要在现在的Dao层次做一个侵入的,尽管这点经过一定的方法(Template Pattern)是可以实现无侵入性的...
目前感觉在对象实例级别的权限控制上还是没有非常好的方法...
曾经考虑过是否可以采用AOP的weaver来实现...
还有就是在对象实例级别是否为权限控制还是业务规则定义方面是有一定的区分难度的,很多时候很难明白的去标识哪个是数据权限、哪个是业务规则,感觉在这两点上挺容易发生混淆的现象。