2008-11-22 97 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应用程序保持分离,并具有不同的单独类加载器。也许值得看看那里的代码。