Ich versuche, ein flexibles ACL-Framework in Java für meine Anwendung zu erstellen.
Viele ACL-Frameworks basieren auf einer Whitelist von Regeln, wobei eine Regel die Form Eigentümer: Aktion: Ressource hat . Beispielsweise,
- "JOHN kann die Ressource FOOBAR-1 ANZEIGEN"
- "MARY kann die Ressource FOOBAR-1 ANZEIGEN"
- "MARY kann Ressource FOOBAR-1 BEARBEITEN"
Dies ist attraktiv, da die Regeln einfach in einer Datenbank serialisiert / beibehalten werden können. Meine Anwendung verfügt jedoch über eine komplexe Geschäftslogik. Beispielsweise,
- "Alle Benutzer in Abteilung 1 mit einem Dienstalter von über 5 Jahren können die Ressource FOOBAR-1 ANZEIGEN, die sonst nicht autorisiert ist."
- "Alle Benutzer in Abteilung 2 können die Ressource FOOBAR-2 anzeigen, wenn das Datum nach dem 15.03.2016 liegt. Andernfalls sind sie nicht autorisiert."
Auf den ersten Blick wäre es ein Alptraum, ein Datenbankschema zu entwickeln, das mit unendlich komplexen Regeln wie diesen umgehen kann. Daher scheint es, als müsste ich sie in die kompilierte Anwendung "backen", sie für jeden Benutzer auswerten und dann als Ergebnis der Auswertung Regeln für Eigentümer: Aktion: Ressource erstellen . Ich möchte vermeiden, die Logik in die kompilierte Anwendung einzubinden.
Daher habe ich mir überlegt, eine Regel in Form eines Prädikats darzustellen : action: resource , wobei das Prädikat ein boolescher Ausdruck ist, der festlegt, ob ein Benutzer zulässig ist. Das Prädikat wäre eine Zeichenfolge eines JavaScript-Ausdrucks, der von Javas Rhino-Engine ausgewertet werden könnte. Beispielsweise,
return user.getDept() == 1 && user.seniority > 5;
Auf diese Weise können die Prädikate problemlos in der Datenbank gespeichert werden.
Ist das schlau ? Ist das schlampig ? Ist das eine Spielerei ? Ist das überarbeitet ? Ist das sicher (anscheinend kann Java die Rhino Engine sandboxen).