Próbuję utworzyć elastyczną strukturę ACL w Javie dla mojej aplikacji.
Wiele frameworków ACL jest zbudowanych na białej liście reguł, gdzie reguła ma postać właściciel: akcja: zasób . Na przykład,
- „JOHN może ZOBACZYĆ zasób FOOBAR-1”
- „MARY może ZOBACZ zasób FOOBAR-1”
- „MARY może EDYTOWAĆ zasób FOOBAR-1”
Jest to atrakcyjne, ponieważ reguły można łatwo serializować / utrwalać w bazie danych. Ale moja aplikacja ma złożoną logikę biznesową. Na przykład,
- „Wszyscy użytkownicy w dziale 1 z ponad 5-letnim stażem pracy mogą ZOBACZ zasób FOOBAR-1, w przeciwnym razie nie są autoryzowani”
- „Wszyscy użytkownicy w dziale 2, jeśli data jest późniejsza niż 15.03.2016, mogą ZOBACZ zasób FOOBAR-2, w przeciwnym razie nie autoryzowani”
Na pierwszy rzut oka koszmarem byłoby opracowanie schematu bazy danych, który mógłby obsługiwać nieskończenie złożone reguły takie jak te. Dlatego wydaje się, że musiałbym „upiec” je w skompilowanej aplikacji, ocenić dla każdego użytkownika, a następnie wygenerować reguły właściciel: akcja: zasoby w wyniku oceny. Chcę uniknąć upieczenia logiki w skompilowanej aplikacji.
Tak więc myślałem o reprezentowaniu reguły w formie predykatu : akcja: zasób , gdzie predykat jest wyrażeniem logicznym, które określa, czy użytkownik jest dozwolony. Predykat byłby ciągiem wyrażenia JavaScript, który mógłby być oceniany przez silnik Rhino Java. Na przykład,
return user.getDept() == 1 && user.seniority > 5;
W ten sposób predykaty można łatwo utrwalić w bazie danych.
Czy to jest sprytne ? Czy to jest niechlujne ? Czy to jest chwytliwe ? Czy to jest przeprojektowane ? Czy jest to bezpieczne (podobno Java może piaskownic silnik Rhino).