我在Java中授予权限时遇到了一些问题。我想实现具有所有权限的app(例如myapp
),它以正常方式运行,但是当它加载代码时(来自.jar或.class)(例如foo.jar
和bar.class
)从特定位置(例如http://example.net/libs
),此代码应以特定权限运行。
我认为我唯一需要做的就是将所有权限授予myapp
(通过政策文件),然后只需创建ProtectionDomain
(位置http://example.net/libs/*
并具有指定的权限)并通过AccessController
运行库。
但是当我向 myapp
授予权限(仅)(通过策略文件,请参见底部)时,它们将被授予所有代码(包括库foo.jar
和bar.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