2016-04-20 56 views
1

我正在開發一個使用spring 4.0.6和Hibernate 4.2.21的應用程序。我有一個實體如下:如何使用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 
    */ 

} 

換句話說,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-1Node-2 & Node-3)。現在我們要獲得一個用戶read acccess在Node-1,Node-1.1 & Node-1-2節點。我們如何實現它?

回答

0

您可以使用ACL繼承。你必須爲每個孩子添加一個ObjectIdentity。請注意,acl_object_identity表具有parent_objectentries_inheriting屬性。

無關,如果您使用的是你應該考慮創建與ACL實體加盟,使您可以利用數據庫過濾這將改善性能規格大集合應用層過濾。

+0

我將所有節點添加到acl表中,但什麼是'parent_object'和'entries_inheriting'角色? –

+0

'parent_object'是所有第二級節點的第一級節點的ID,如果您希望它們具有與父級相同的權限,則'entries_inheriting'必須設置爲true。對於第三級節點,您必須指定從中繼承的第二級節點的ID。 – NikolaB

+0

當您使用'@PostFilter(「hasPermission(filterObject,'read')」)'時,Acl只檢查第一級節點,並且它不適用於子節點。在'getNodes'方法的實體類中定義'@PostFilter(「hasPermission(filterObject,'read')」)'是個好主意嗎? –