J'essaie de créer un cadre ACL flexible en Java pour mon application.
De nombreux frameworks ACL sont construits sur une liste blanche de règles, où une règle est sous la forme propriétaire: action: ressource . Par exemple,
- "JOHN peut VOIR la ressource FOOBAR-1"
- "MARIE peut VOIR la ressource FOOBAR-1"
- "MARIE peut MODIFIER la ressource FOOBAR-1"
Ceci est intéressant car les règles peuvent facilement être sérialisées / conservées dans une base de données. Mais mon application a une logique métier complexe. Par exemple,
- "Tous les utilisateurs du département 1 avec plus de 5 ans d'ancienneté peuvent VOIR la ressource FOOBAR-1, sinon non autorisé"
- "Tous les utilisateurs du département 2, si la date est postérieure au 15/03/2016, peuvent VOIR la ressource FOOBAR-2, sinon non autorisé"
À première vue, ce serait un cauchemar de concevoir un schéma de base de données capable de gérer des règles infiniment complexes comme celles-ci. Par conséquent, il semble que j'aurais besoin de les "cuire" dans l'application compilée, de les évaluer pour chaque utilisateur, puis de produire des règles owner: action: resource à la suite de l'évaluation. Je veux éviter de faire cuire la logique dans l'application compilée.
Donc, je pensais représenter une règle sous forme de prédicat : action: ressource , où le prédicat est une expression booléenne qui détermine si un utilisateur est autorisé. Le prédicat serait une chaîne d'une expression JavaScript qui pourrait être évaluée par le moteur Rhino de Java. Par exemple,
return user.getDept() == 1 && user.seniority > 5;
Ce faisant, les prédicats pourraient facilement être conservés dans la base de données.
Est-ce intelligent ? Est-ce bâclé ? Est-ce gimmicky ? Est-ce trop conçu ? Est-ce sûr (apparemment, Java peut sandboxer le moteur Rhino).