我似乎遇到了一些问题。我已经彻底研究了这个主题,但没有找到任何解决方案。
我有一个主要的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
有什么我做错了吗?有没有更好的方法来实现预期目标?非常感谢任何信息!