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

时间:2008-11-22 11:45:25

标签: java security classpath sandbox

我有一个Java应用程序,我想让它可扩展。要创建扩展,我们公司内的开发人员将编写一个实现特定接口的Java类。他们也可能希望编写相关的帮助程序类。我想在不中断的情况下将这些扩展加载到应用程序中。

我想限制这个类可以对以下内容做什么:

  1. 调用应用程序API中的方法(这将是构造函数的参数)
  2. 在同一个包中创建其他对象的实例(因此扩展类的作者可以使用其他类来完成工作)。
  3. 调用类时,传入的API对象已经定义了“customer”并存储为成员变量。它将使用它来限制通过API访问该客户的数据。

    我不希望这些类执行诸如访问数据库,写入磁盘或以其他方式处理等事情。这主要是依赖管理和封装的努力,因为同一个开发人员团队将有权编写这两个扩展和核心系统。

    这有什么模式吗?我是在正确的轨道上吗?

2 个答案:

答案 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应用程序保持独立,具有不同的单个类加载器。也许值得一看那里的代码。