Как предоставить различные разрешения различным классам Java?


У меня есть приложение Java, и я хотел бы сделать его расширяемым. Чтобы создать расширение, разработчики из нашей компании напишут класс Java, который реализует определенный интерфейс. Они также могут захотеть написать ассоциированные вспомогательные классы. Я хотел бы загрузить эти расширения в приложение без сбоев.

Я хотел бы ограничить возможности этого класса следующим:

  1. вызов методов в API приложения (это будет параметр для конструктор)
  2. Создание экземпляров других объектов в том же пакете (таким образом, автор класса расширения может использовать другие классы для выполнения работы).

При вызове класса переданный объект API уже будет иметь "customer", определенный и сохраненный как переменная-член. Он будет использовать это для ограничения доступа через API к данным этого клиента.

Я не хочу, чтобы эти классы выполняли такие действия, как доступ к базе данных, запись на диск или другие делать вещи и т. д. Это в основном попытка управления зависимостями и инкапсуляции, поскольку одна и та же команда разработчиков будет иметь доступ к написанию как расширений, так и основной системы.

Есть ли для этого какая-то закономерность? Я на правильном пути?

2 6

2 ответа:

Вам не нужно искать ничего экзотического. Обработка этого сценария является фундаментальной особенностью архитектуры безопасности Java.

Каждый класс имеет "кодовую базу", местоположение, из которого он был загружен. Таким образом, если вы упакуете каждое расширение в отдельный JAR (или разнесете в отдельный каталог), вы сможете настроить разрешения, предоставленные этой кодовой базе.

В вашем случае, это звучит даже проще. Если я правильно понимаю, все расширения будут иметь одинаковые привилегии, которые меньше, чем у родительского приложения. Таким образом, все они могут совместно использовать кодовую базу.

Вот пример файла политики:

grant codeBase "file:/path/to/app/lib/*" {
  permission java.io.FilePermission "/path/to/app/-", "read";
  permission java.io.FilePermission "/path/to/app/data/-", "read,write,delete";
};

grant codeBase "file:/path/to/app/ext/*" {
  permission java.util.PropertyPermission "java.io.tmpdir", "read";
  permission java.io.FilePermission "${java.io.tmpdir}/myapp/-", "read,write,delete";
};

Этот простой пример должен работать в любой версии Java. Более новые версии имеютрасширенный синтаксис политики для предоставления разрешений субъекту, аутентифицированному JAAS.

Я не знаю деталей реализации, но, похоже, то, что вы имеете в виду, близко к тому, что уже делает сервер Apache Tomcat. Отдельные веб-приложения в Tomcat хранятся отдельно, имея разные загрузчики отдельных классов. Может быть, стоит взглянуть на код там.