2016-04-20 5 views
1

Je développe une application en utilisant spring 4.0.6 et Hibernate 4.2.21. J'ai une entité comme suit:Comment implémenter des nœuds d'arbre en utilisant Spring Security ACL?

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 
    */ 

} 

En d'autres termes, l'entité A est un arbre. Maintenant, je veux sécuriser tous les nœuds de l'arbre. Considérez l'arbre suivant:

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 

je sécuriser le noeud comme suit:

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

Ce code des nœuds sûrs en premier niveau (Node-1, Node-2 & Node-3). Maintenant, nous voulons obtenir un utilisateur read acccess dans Node-1, Node-1.1 & Node-1-2 nœuds. Comment l'implémentons-nous?

Répondre

0

Vous pouvez utiliser l'héritage ACL. Vous devrez ajouter un ObjectIdentity pour chaque enfant. Prenez note que le tableau acl_object_identity a parent_object et entries_inheriting attributs. Indépendante, si vous utilisez le filtrage au niveau de l'application de grandes collections, vous devriez penser à créer des spécifications qui rejoindront les entités ACL pour que vous puissiez utiliser un filtrage de base de données qui améliorerait les performances.

+0

J'ajoute tous les nœuds aux tables acl, Mais qu'est-ce que les rôles 'parent_object' et' entries_inheriting'? –

+0

'parent_object' est l'ID du noeud de premier niveau pour tous les nœuds de second niveau et' entries_inheriting' doit être défini sur true si vous voulez qu'ils aient les mêmes permissions que le parent. Pour les nœuds de troisième niveau, vous devez spécifier l'ID du nœud de second niveau dont ils héritent. – NikolaB

+0

Lorsque vous utilisez '@PostFilter (" hasPermission ("filterObject, 'read')") ', Acl ne vérifie que les nœuds de premier niveau et ne fonctionne pas avec child. Est-ce une bonne idée de définir '@PostFilter (" hasPermission (filterObject, 'read') ")' à la classe d'entité pour la méthode 'getNodes'? –