Как предоставить разные разрешения для различных классов Java? - PullRequest
6 голосов
/ 22 ноября 2008

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

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

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

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

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

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

Ответы [ 2 ]

10 голосов
/ 23 ноября 2008

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

2 голосов
/ 22 ноября 2008

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

...