1

我正在使用 spring 4.0.6 和 Hibernate 4.2.21 开发一个应用程序。我有一个实体如下:

public class A {
   @OneToMany(mappedBy="parent", fetch = FetchType.LAZY)
   private Set<A> children = new HashSet<A>(0);

   @ManyToOne(fetch = FetchType.EAGER)
   private A parent;

   /*
    *
    * Getters And Setters
    */

}

换句话说,A实体是一棵树。现在我想保护树的所有节点。考虑以下树:

Node-1   
   Node-1.1
      Node-1.1.1
      Node-1.1.2
   Node-1.2
   Node-1.3
Node-2
Node-3
   Node-3.1
   Node-3.2
   Node-3.3

我保护节点如下:

@PostFilter("hasPermission(filterObject, 'read')")
public List<A> getAll() {}

Node-1此代码保护第一级( ,Node-2& Node-3)中的节点。现在我们想要readNode-1, Node-1.1&Node-1-2节点中获得用户访问权限。我们如何实现它?

4

1 回答 1

1

您可以使用 ACL 继承。您必须ObjectIdentity为每个孩子添加一个。请注意,acl_object_identity表具有parent_objectentries_inheriting属性。

无关,如果您正在使用大型集合的应用程序级过滤,您应该考虑创建与 ACL 实体连接的规范,以便您可以利用数据库过滤来提高性能。

于 2016-04-20T13:49:19.997 回答