【问题标题】:How to grant different permissions to various Java classes?如何为各种 Java 类授予不同的权限?
【发布时间】:2008-11-22 11:45:24
【问题描述】:

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

我想限制这个类可以做的事情如下:

  1. 调用应用程序 API 中的方法(这将是构造函数的参数)
  2. 在同一个包中创建其他对象的实例(以便扩展类的作者可以使用其他类来完成工作)。

当调用类时,传入的 API 对象已经定义了一个“客户”并将其存储为成员变量。它将使用它来限制通过 API 访问该客户的数据。

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

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

【问题讨论】:

    标签: java security classpath sandbox


    【解决方案1】:

    您无需寻找任何异国情调的东西。处理这种情况是 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 应用程序通过不同的单独类加载器保持分离。也许值得看看那里的代码。

      【讨论】:

        猜你喜欢
        • 2013-05-16
        • 2017-07-06
        • 2023-04-02
        • 1970-01-01
        • 2021-07-17
        • 2013-12-24
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        相关资源
        最近更新 更多