Frage

Ich habe eine Java-Anwendung, und ich mag es erweiterbar machen. Um eine Erweiterung, Entwickler innerhalb unseres Unternehmens zu schaffen eine Java-Klasse schreiben, die eine bestimmte Schnittstelle implementiert. Sie können auch im Zusammenhang Hilfsklassen schreiben möchten. Ich mag diese Erweiterungen in die Anwendung ohne einen Ausfall laden.

Ich möchte begrenzen, was diese Klasse folgende Möglichkeiten:

  1. Anruf Methoden in der Anwendung des API (dies wird ein Parameter an den Konstruktor sein)
  2. Erstellen Sie Instanzen anderer Objekte im gleichen Paket (so der Autor der Erweiterung Klasse kann andere Klassen verwenden die Arbeit zu erledigen).

Wenn die Klasse in der API-Objekt aufgerufen wird, die vergangen ist bereits ein „Kunde“ definiert haben und als Member-Variable gespeichert. Es wird diese nutzen, um Zugriff über die API dieser Kunden Daten zu begrenzen.

Ich will nicht diese Klassen Dinge wie der Zugriff auf die Datenbank zu tun, auf der Festplatte zu schreiben oder auf andere Weise Dinge usw. zu tun Dies ist vor allem ein Versuch, bei Abhängigkeitsmanagement und Verkapselung als das gleiche Team von Entwicklern Zugang hat beiden Erweiterungen zu schreiben und das Kernsystem.

Gibt es ein Muster für das? Bin ich auf dem richtigen Weg?

War es hilfreich?

Lösung

Sie brauchen keine exotischen für irgendetwas zu suchen. Umgang mit diesem Szenario ist ein grundlegendes Merkmal der Java-Sicherheitsarchitektur.

Jede Klasse hat einen „Code-Basis“, den Ort, von dem sie geladen wurde. Also, wenn Sie jede Erweiterung in einem separaten JAR-Paket (oder explodierten in einem separaten Verzeichnis), werden Sie in der Lage sein, die Schneider in dieser Codebasis erteilten Berechtigungen.

In Ihrem Fall klingt es noch einfacher. Wenn ich richtig verstehe, haben alle Erweiterungen die gleichen Privilegien, die als die der Anwendung Eltern weniger sind. So können sie alle eine Code-Basis teilen.

Hier ist ein Beispiel für eine Richtliniendatei:

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";
};

Dieses einfache Beispiel sollte in eine beliebige Version von Java . Neuere Versionen haben Politik Syntax erweitert Berechtigungen zu erteilen zu einem Thema von JAAS authentifiziert.

Andere Tipps

Ich weiß nicht, die Details der Implementierung, aber es scheint, was haben Sie in den Sinn kommt dem nahe, was der Apache Tomcat Server bereits der Fall ist. Einzelne webapps in Tomcat werden getrennt gehalten verschiedenen einzelnen Klassenlader aufweist. Vielleicht gibt es einen Blick auf den Code ist es lohnt sich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top