Как реализовать узлы дерева с помощью Spring Security ACL?

Я разрабатываю приложение с использованием 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). Теперь мы хотим получить доступ пользователя read к узлам Node-1, Node-1.1 и Node-1-2. Как мы это реализуем?


person Morteza Malvandi    schedule 20.04.2016    source источник


Ответы (1)


Вы можете использовать наследование ACL. Вам нужно будет добавить ObjectIdentity для каждого ребенка. Обратите внимание, что таблица acl_object_identity имеет атрибуты parent_object и entries_inheriting.

Несвязно, если вы используете фильтрацию больших коллекций на уровне приложения, вам следует подумать о создании спецификаций, которые объединяются с объектами ACL, чтобы вы могли использовать фильтрацию базы данных, которая улучшила бы производительность.

person NikolaB    schedule 20.04.2016
comment
Я добавляю все узлы в таблицы acl, но что такое роли parent_object и entries_inheriting? - person Morteza Malvandi; 20.04.2016
comment
parent_object - это идентификатор узла первого уровня для всех узлов второго уровня, и entries_inheriting должен быть установлен в значение true, если вы хотите, чтобы они имели те же разрешения, что и родительский. Для узлов третьего уровня необходимо указать идентификатор узла второго уровня, от которого они наследуются. - person NikolaB; 20.04.2016
comment
Когда вы используете @PostFilter("hasPermission(filterObject, 'read')"), Acl проверяет только узлы первого уровня и не работает с дочерними. Это хорошая идея определить @PostFilter("hasPermission(filterObject, 'read')") в классе сущности для getNodes метода? - person Morteza Malvandi; 23.04.2016