Sto cercando di creare un framework ACL flessibile in Java per la mia applicazione.
Molti framework ACL sono costruiti su una whitelist di regole, in cui una regola è sotto forma di owner: action: resource . Ad esempio,
- "JOHN può VISUALIZZARE la risorsa FOOBAR-1"
- "MARY può VISUALIZZARE la risorsa FOOBAR-1"
- "MARY può modificare la risorsa FOOBAR-1"
È interessante perché le regole possono essere facilmente serializzate / mantenute su un database. Ma la mia applicazione ha una logica aziendale complessa. Ad esempio,
- "Tutti gli utenti del dipartimento 1 con più di 5 anni di anzianità possono VISUALIZZARE la risorsa FOOBAR-1, altrimenti non autorizzati"
- "Tutti gli utenti del dipartimento 2, se la data è successiva al 15/03/2016, possono VISUALIZZARE la risorsa FOOBAR-2, altrimenti non autorizzata"
A prima vista, sarebbe un incubo escogitare uno schema di database che possa gestire regole infinitamente complesse come queste. Pertanto, sembra che avrei bisogno di "infornarli" nell'applicazione compilata, valutarli per ciascun utente e quindi produrre regole proprietario: azione: risorsa come risultato della valutazione. Voglio evitare di cuocere la logica nell'applicazione compilata.
Quindi, stavo pensando di rappresentare una regola sotto forma di predicato : action: resource, dove il predicato è un'espressione booleana che determina se un utente è autorizzato . Il predicato sarebbe una stringa di un'espressione JavaScript che potrebbe essere valutata dal motore di Rhino di Java. Ad esempio,
-
return user.getDept() == 1 && user.seniority > 5;
In tal modo, i predicati potrebbero essere facilmente mantenuti nel database.
Questo è intelligente ? È questo sloppy ? È questo ingannevole ? Questo è troppo ingegnerizzato ? È questo sicuro (a quanto pare, Java può sandbox il motore di Rhino).