2008-11-22 95 views
6

我有一個Java應用程序,我想使其可擴展。爲了創建擴展,我們公司的開發人員將編寫一個實現特定接口的Java類。他們也可能希望編寫關聯的助手類。我想將這些擴展加載到應用程序中而不會中斷。如何爲不同的Java類授予不同的權限?

我想限制一下這個類可以做到以下幾點:應用程序的API中

  1. 通話的方法(這將是在構造函數的參數)
  2. 創建中的其他對象的實例相同的包(所以擴展類的作者可以使用其他類來完成工作)。

當調用該類時,傳入的API對象已經有一個「customer」定義並存儲爲成員變量。它將使用此限制通過API訪問該客戶的數據。

我不希望這些類執行諸如訪問數據庫,寫入磁盤或執行其他操作等事情。這主要是在依賴管理和封裝方面的努力,因爲同一組開發人員將有權寫入擴展和核心繫統。

有沒有這樣的模式?我在正確的軌道上嗎?

回答

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

這個簡單的例子應該any version of Java工作。較新的版本有extended policy syntax將權限授予由JAAS認證的主題。

2

我不知道實現的細節,但似乎你的想法接近於Apache Tomcat服務器已經做了什麼。 Tomcat中的單獨web應用程序保持分離,並具有不同的單獨類加載器。也許值得看看那裏的代碼。