У меня есть Java-приложение, и я хотел бы сделать его расширяемым. Чтобы создать расширение, разработчики в нашей компании напишут класс Java, реализующий определенный интерфейс. Они также могут захотеть написать связанные вспомогательные классы. Я хочу, чтобы эти расширения загружались в приложение без сбоев.
Я хотел бы ограничить возможности этого класса следующим:
Когда класс вызывается, переданный объект API уже имеет «клиент», определенный и сохраненный как переменная-член. Он будет использовать это для ограничения доступа через API к данным этого клиента.
Я не хочу, чтобы эти классы выполняли такие действия, как доступ к базе данных, запись на диск или другие действия и т. д. Это в основном усилия по управлению зависимостями и инкапсуляции, поскольку одна и та же команда разработчиков будет иметь доступ для записи как расширений, так и ядра. система.
Есть ли для этого образец? Я на правильном пути?




Я не знаю деталей реализации, но похоже, что то, что вы имеете в виду, близко к тому, что уже делает сервер Apache Tomcat. Отдельные веб-приложения в Tomcat разделены и имеют разные загрузчики отдельных классов. Может стоит посмотреть там код.
Не нужно искать ничего экзотического. Обработка этого сценария - фундаментальная особенность архитектуры безопасности 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.