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 回答