Neo4j – Bilden von ACL-Knoten für Auswertungen

Für die Berechnung und dem Vergleich der effektiven Rechte auf Ordnern müssen ACLs gebildet werden, weil die ACE über alle Verzeichnisse einzeln durchzugehen viel zu lange dauern würde.

Zuerst muss ein Constraints und ein Index gebildet werden:

 

CREATE CONSTRAINT ON (acl:ACL) ASSERT acl.Key IS UNIQUE

 

 

Mit der folgenden Abfragen werden alle Verzeichnisse ermittelt, die explizite Rechte haben, danach werden alle ACE von diesen Verzeichnissen geholt, eine eindeutiger Key wird erstellt und in den ACL Knoten geschrieben.
Zu jedem Verzeichnis das die selbe ACL hat, wird ein Kante gebildet.

 

match (Verzeichnis)<-[r:rel_right0{explicit:1}]-(:ACE) with distinct 
Verzeichnis match (Verzeichnis)<-[:rel_right0]-(x) with distinct 
Verzeichnis,x order by x.sid with Verzeichnis, collect(x.sid + '_' + 
x.type + '_' + x.ace + '_' + x.ace_flags) as key with Verzeichnis, key, 
apoc.util.sha1([reduce(a="", m in key|a+ m)]) as x merge (acl:ACL {Key:x}) 
merge (acl)-[:rel_acl]->(Verzeichnis)

 

—————-
Und für alle Verzeichnisse, die ausschließlich vererbte Rechte haben:

match (n)<-[r:rel_right0]-(x:ACE) where not r.explicit='1' 
with distinct n,x order by x.sid limit 1000 with n, collect
(x.sid + '_' + x.type + '_' + x.ace + '_' + x.ace_flags) as 
key with n, apoc.util.sha1([reduce(a="", m in key|a+ m)]) as x merge 
(a:ACL {Key:x}) merge (a)-[r:rel_acl{explicit:'0'}]->(n)

 

 

Ohne „Return“ Ausgabe ist diese Abfrage auch bei Millionen von Verzeichnisse extrem schnell:
3,5 Mil Verzeichnisse gesammt
420.000 Verzeichnisse mit expl. Rechten
13558 ACLs -> 258775 ms

 

Hiermit wir die ACL direkt mit den Accounts verbunden, um sie schneller auszählen zu können

MATCH (n:ACL)-[:rel_acl]->(u)<-[:rel_right0]-(x)-[:rel_ace]->(m) with distinct n,m merge 
(n)-[:rel_acl_a]-(m)

 

 

Hiermit sollen die effektiven Mitglieder der jeweiligen ACL ermittelt werden: Was natürlich in Abhängigkeit zur Anzahl der Accounts in der Domäne verschieden lange dauert.

MATCH (n:ACL)-[:rel_acl_a | rel_member *..]->(p) where p.type='person' 
with n, count(distinct p) as p match ()<-[r:rel_acl]-(n) RETURN distinct 
p as Accounts, count( distinct r) as Anzahl_Verzeichnisse order by Accounts 
desc

 

Permanentlink zu diesem Beitrag: https://help.migraven.com/neo4j-bilden-von-acl-knoten-fuer-auswertungen/