修改SecurityManager

时间:2014-09-25 12:29:51

标签: java security reflection permissions codebase

嘿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是否能解决我的问题?

感谢阅读和回答!

0 个答案:

没有答案