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