Я намагаюся створити гнучку рамку ACL на Java для свого застосування.
Багато рамок ACL побудовані за списком правил, де правило складається у формі власника: action: resource . Наприклад,
- "JOHN може ПРОСМОТРИ ресурс FOOBAR-1"
- "МЕРЕ може бачити ресурс FOOBAR-1"
- "МЕРЕ може редагувати ресурс FOOBAR-1"
Це привабливо, тому що правила легко можна серіалізувати / зберігати до бази даних. Але моя програма має складну бізнес-логіку. Наприклад,
- "Усі користувачі у відділі 1 із стажем понад 5 років можуть переглядати ресурс FOOBAR-1, ще не дозволений"
- "Усі користувачі у відділі 2, якщо дата після 15.03.2016, можуть переглядати ресурс FOOBAR-2, ще не дозволений"
Спочатку задумавшись, було б кошмаром розробити схему бази даних, яка могла б обробляти нескінченно складні правила, такі як ці. Тому, здається, мені потрібно «запекти» їх у складеному додатку, оцінити їх для кожного користувача, а потім створити власнику: action: правила правил в результаті оцінки. Я хочу уникати логіки в складеній програмі.
Отже, я думав представляти правило у формі предиката : action: resource , де предикат - булевий вираз, який визначає, чи дозволений користувач. Присудок буде рядком вираження JavaScript, який можна оцінити за допомогою двигуна Rhino Java. Наприклад,
return user.getDept() == 1 && user.seniority > 5;
При цьому предикати легко зберігаються до бази даних.
Це розумний ? Це неохайно ? Це хитрість ? Це надмірно розроблено ? Це безпечно (мабуть, Java може пісочницю двигуна Rhino).