如何为不同的Java类授予不同的权限?

6
我有一个Java应用程序,希望使其可扩展。要创建一个扩展,我们公司的开发人员将编写一个实现特定接口的Java类。他们还可能希望编写相关的辅助类。我希望在不停机的情况下将这些扩展加载到应用程序中。
我想限制该类只能执行以下操作:
1.调用应用程序API中的方法(这将作为构造函数的参数)。 2.创建同一包中其他对象的实例(因此扩展类的作者可以使用其他类来完成工作)。
当调用该类时,传递的API对象将已经定义并存储为成员变量的“客户”将被使用。它将使用这个客户端来通过API限制对客户数据的访问。
我不希望这些类做诸如访问数据库、写入磁盘或执行其他操作等事情。这主要是为了依赖管理和封装,因为同一团队的开发人员将有权限编写扩展和核心系统。
是否有相应的模式?我走在正确的道路上吗?
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认证的主体授予权限。


2

我不知道具体实现细节,但是看起来你所想的与Apache Tomcat服务器已经很接近了。在Tomcat中,每个Web应用程序都是独立的,拥有不同的类加载器。也许值得查看一下那里的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接