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

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

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

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

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
0
6 015
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не знаю деталей реализации, но похоже, что то, что вы имеете в виду, близко к тому, что уже делает сервер 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.

Другие вопросы по теме