0

我似乎遇到了一些问题。我已经彻底研究了这个主题,但没有找到任何解决方案。

我有一个主要的java程序,例如“服务器”,它使用这种方法导入java .jar“插件”:如何在运行时从文件夹或JAR加载类?

现在,假设一个插件可以运行并影响其他插件的配置文件/系统文件。

我已经调查过了SecurityManager,但我无法获取 Object 试图访问所述权限的内容。

我注意到我可以Java policy files用来将类/代码库限制为某些权限。最终目标是允许每个插件访问它们自己的目录(我们可以放心地假设它已经创建),并限制其他某些权限。

我使用了以下策略文件来查看是否可以将 codeBase 用于 jar 文件中的路径,但它似乎不起作用。

例如: 在 policy.pol 中:

grant codeBase "jar:file:C:\Users\100048201\git\BotServ\run\plugins\myPlugin.jar!/"{
permission java.io.FilePermission "C:\Users\100048201\git\BotServ\run\-", "read,write";
permission java.io.FilePermission "run\plugins\lol.txt", "read,write";
};

..我可以使用以下代码在运行时设置策略。

System.setProperty("java.security.policy", "policy.pol");
java.security.Policy.getPolicy().refresh();
System.setSecurityManager(new SecurityManager());

以下代码位于 myPlugin.jar 中名为“Main”的类中

File f = new File("run/plugins/lol.txt");
        try {
            f.createNewFile();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

当我使用反射运行上面的代码时,会出现以下异常:

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at MainClass.finish(MainClass.java:102)
    at MainClass.loadClasses(MainClass.java:87)
    at MainClass.main(MainClass.java:26)
Caused by: java.security.AccessControlException: access denied ("java.io.FilePermission" "run\plugins\lol.txt" "write")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:884)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.SecurityManager.checkWrite(SecurityManager.java:979)
    at java.io.File.createNewFile(File.java:1008)
    at com.myththewolf.e621bot.Main.onEnable(Main.java:21)
    ... 7 more

有什么我做错了吗?有没有更好的方法来实现预期目标?非常感谢任何信息!

4

0 回答 0