我有一个Java应用程序,我想让它可扩展。要创建扩展,我们公司内的开发人员将编写一个实现特定接口的Java类。他们也可能希望编写相关的帮助程序类。我想在不中断的情况下将这些扩展加载到应用程序中。
我想限制这个类可以对以下内容做什么:
调用类时,传入的API对象已经定义了“customer”并存储为成员变量。它将使用它来限制通过API访问该客户的数据。
我不希望这些类执行诸如访问数据库,写入磁盘或以其他方式处理等事情。这主要是依赖管理和封装的努力,因为同一个开发人员团队将有权编写这两个扩展和核心系统。
这有什么模式吗?我是在正确的轨道上吗?
答案 0 :(得分:10)
你不需要寻找异国情调。处理此场景是Java安全体系结构的基本特性。
每个类都有一个“codebase”,即加载它的位置。因此,如果您将每个扩展包装在单独的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验证的主题授予权限。
答案 1 :(得分:2)
我不知道实现细节,但看起来你的想法接近于Apache Tomcat服务器已经做的事情。 Tomcat中的各个Web应用程序保持独立,具有不同的单个类加载器。也许值得一看那里的代码。