Sto cercando di creare un framework ACL flessibile in Java per la mia applicazione.
Molti framework ACL sono basati su una whitelist di regole, in cui una regola ha la forma di proprietario: azione: risorsa . Per esempio,
- "JOHN può VISUALIZZARE la risorsa FOOBAR-1"
- "MARY può VISUALIZZARE la risorsa FOOBAR-1"
- "MARY può MODIFICARE la risorsa FOOBAR-1"
Questo è interessante perché le regole possono essere facilmente serializzate / persistenti in un database. Ma la mia applicazione ha una logica aziendale complessa. Per esempio,
- "Tutti gli utenti del dipartimento 1 con oltre 5 anni di anzianità possono VISUALIZZARE la risorsa FOOBAR-1, altrimenti non autorizzato"
- "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 in grado di gestire regole infinitamente complesse come queste. Pertanto, sembra che avrei bisogno di "inserirli" nell'applicazione compilata, valutarli per ciascun utente e quindi produrre il proprietario: azione: regole delle risorse a seguito della valutazione. Voglio evitare di inserire la logica nell'applicazione compilata.
Quindi, stavo pensando di rappresentare una regola sotto forma di predicato : azione: risorsa , 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 Rhino di Java. Per esempio,
return user.getDept() == 1 && user.seniority > 5;
In tal modo, i predicati potrebbero essere facilmente mantenuti nel database.
È intelligente ? Questo è sciatto ? È ingannevole ? È troppo ingegnerizzato ? È sicuro (a quanto pare, Java può eseguire il sandbox del motore di Rhino).