6

Java アプリケーションがあり、それを拡張可能にしたいと考えています。拡張機能を作成するには、社内の開発者が特定のインターフェースを実装する Java クラスを作成します。また、関連するヘルパー クラスを作成することもできます。これらの拡張機能を停止することなくアプリケーションにロードしたいと考えています。

このクラスでできることを次のように制限したいと思います。

  1. アプリケーションの API でメソッドを呼び出します (これはコンストラクターへのパラメーターになります)
  2. 同じパッケージ内に他のオブジェクトのインスタンスを作成します (これにより、拡張クラスの作成者は他のクラスを使用して作業を完了できます)。

クラスが呼び出されると、渡された API オブジェクトには、すでに「顧客」が定義されており、メンバー変数として格納されています。これを使用して、API を介したアクセスをその顧客のデータに制限します。

これらのクラスに、データベースへのアクセス、ディスクへの書き込み、その他の処理などを実行させたくありません。同じ開発者チームが拡張機能とコアの両方を作成するアクセス権を持つため、これは主に依存関係の管理とカプセル化への取り組みです。システム。

これにはパターンがありますか?私は正しい軌道に乗っていますか?

4

2 に答える 2

10

エキゾチックなものを探す必要はありません。このシナリオの処理は、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 によって認証されたサブジェクトにアクセス許可が付与されます。

于 2008-11-23T01:46:00.357 に答える
2

実装の詳細はわかりませんが、あなたが考えていることは、Apache Tomcatサーバーがすでに行っていることに近づいているようです。Tomcat の個々の Web アプリケーションは、異なる個別のクラス ローダーを持つ分離された状態に保たれます。そこにあるコードを見てみる価値があるかもしれません。

于 2008-11-22T12:12:39.577 に答える