嘿stackoverflow社区!
我正在写一个小程序。在这个程序代码中,编写并运行Web-Interface。现在我希望来自web界面的编写代码只具有一些权限,例如读取特定目录中的文件,而我自己的代码具有所有权限。
我只是通过使用Policy-File的codeBase属性查找了SecurityManager并找到了解决方法。我的想法是给我的代码所有权限,以便编写的代码没有权限。
grant codeBase "file:/PATH/-" {
permission java.security.AllPermission;
};
grant {
};
PATH指向程序的根目录(bin / src为子文件夹)。
直到我调用javax.tools.JavaCompiler.CompilationTask.call()来编译给定代码,它才有效,尽管该文件具有所需的权限:
An exception has occurred in the compiler (1.8.0_05). Please file a bug at the Java Developer Connection (<a href="http://java.sun.com/webapps/bugreport" target="_blank">Report a Bug or Request a Feature</a>) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you.
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "nonBatchMode" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:457)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294)
at java.lang.System.getProperty(System.java:714)
at com.sun.tools.javac.main.Main.compile(Main.java:445)
at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
.
.
.
我不想为每个类型的代码创建.java-和.class文件。对于这个reasen,我使用了一个带有以下URI的ClassLoader:
URI.create( "string:///" + className + Kind.CLASS.extension )
尝试避免使用“signedBy”-attriutes非常重要,因为在Eclipse中签署.jar文件很困难。
这是我的问题:
1)有没有人知道为什么编译器抛出AccessControlException,尽管允许所有需要的权限?
2)有没有人知道如何以这种方式修改SecurityManager?
3)是否可以从我自己的代码中分离包含的代码?
4)SecurityManager是否能解决我的问题?
感谢阅读和回答!