2011-04-07 81 views
3

我有一个加载插件(纯JAR文件)并从中运行代码的应用程序。插件使用URLClassLoader加载。我想阻止这些插件访问文件和其他资源,同时保留我自己的代码的所有权限。Java安全策略:根据类加载器授予访问权

以下是插件代码与我自己的应用程序及其库不同的两个特性: 1)它由为此目的创建的URLClassLoader加载。 2)它的jar文件被复制到一个特定的目录,URLClassLoader从这个目录中获取它们。

但我看不出我如何使用任一功能来制定策略规则。 classloader根本不能在策略规则中使用(可以理解,它是在运行时创建的)。该目录可用于授予特定权限,但不能将其删除。似乎没有“除了这个目录之外的任何地方的代码”的语法。

还有其他的选择吗?

回答

1

子类URLClassLoader。加回你错过的安全位,不要使用URLClassLoader.newInstance。覆盖URLClassLoader.getPermissions(CodeSource)以返回适当的权限。

这可能是最好的,如果父类加载器只有普通类型的插件[静态]使用。主应用程序应该从不同的子类加载器加载。实现类也可以被package.access安全属性隐藏。

+0

工作正常,谢谢! – khinsen 2011-04-08 08:03:07

+0

我在这个问题在这里实现了这个解决方案:http://stackoverflow.com/questions/26340118/extending-urlclassloader-and-overriding-getpermissions-does-not-work - 但我无法得到它的工作,你可能也许看看它,并指出缺陷? – skiwi 2014-10-13 12:34:59