Java ProtectionDomain似乎不起作用

时间:2014-07-02 15:09:19

标签: java security permissions grant

我在Java中授予权限时遇到了一些问题。我想实现具有所有权限的app(例如myapp),它以正常方式运行,但是当它加载代码时(来自.jar或.class)(例如foo.jarbar.class)从特定位置(例如http://example.net/libs),此代码应以特定权限运行。

我认为我唯一需要做的就是将所有权限授予myapp(通过政策文件),然后只需创建ProtectionDomain(位置http://example.net/libs/*并具有指定的权限)并通过AccessController运行库。

但是当我向myapp授予权限()(通过策略文件,请参见底部)时,它们将被授予所有代码(包括库foo.jarbar.class) - 哪个是

所以我停止探索如何授予libs权限,我必须先解决这个问题。

(请参阅底部的编辑)

结构

我的myapp包含主要类(myapp.Main),它位于/home/java/

/home/java/src/myapp/Main.java
/home/java/bin/myapp/Main.class

和图书馆

http://example.net/libs/foo.jar
http://example.net/libs/bar.class

实施

我这样写了myapp.Main.java

package myapp;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class Main {

    public static void main(String[] args) throws IOException {
        //myapp should access
        System.out.println("myapp.Main: " + System.getProperty("user.home"));

        //find Foo class
        Class<?> fooClass = findFooClass();

        //invoke some its method
        // this should fail
        try {
            System.out.println(fooClass.newInstance().toString());
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
            return;
        }

    }

    private static Class<?> findFooClass() throws IOException {
        URL fooClassURL;
        try {
            fooClassURL = new URL("http://example.net/libs/foo.jar");
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return null;
        }

        URLClassLoader ucl = new URLClassLoader(new URL[]{fooClassURL});
        Class<?> fooClass;
        try {
            fooClass = ucl.loadClass("foopackage.Foo");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        } finally {
            ucl.close();
        }

        return fooClass;
    }

}

和班级foopackage.Foo一样

package foopackage;

public class Foo {

    public Foo() {
    }

    private void tryProperty() {
        System.out.println("foopackage.Foo: " + System.getProperty("user.home"));
    }

    @Override
    public String toString() {
        tryProperty();
        return super.toString();
    }
}

运行

当我通过此命令运行myapp时

 java -Djava.security.manager -Djava.security.policy=/home/java/myapp.policy myapp.Main

文件myapp.policy看起来像

grant codeBase "file:/home/java/*" {
   permission java.security.AllPermission;
};

它输出两次主目录,然后输出原始值Foo.toString (请参阅底部的编辑)

我在问 - 我做错了什么?我有什么不理解的?


编辑:

授予整个代码权限的原因很简单 - 当我在探索安全性时,我有点纠结,我通过文件~/java.policy授予了所有权限。

所以,现在我可以按预期通过策略文件授予权限。但仍无效通过AccessController授予权限。 myapp.Main具有通过策略文件授予的权限并且工作正常(因此它打印一次主目录),但当它(通过AccessController.doPrivileged)调用FooClassToStringAction的操作时,{{{ 1}}无权访问属性(我通过foopackage.Foo授予IMHO)。更新了ProtectionDomain课程&#39;代码:

myapp.Main

0 个答案:

没有答案