【发布时间】:2018-09-16 14:39:17
【问题描述】:
在实现我的平台以能够使用反射动态加载 jar 文件后,我遇到了一个安全问题。 jar 文件可能是“危险的”并且包含可能影响事物的代码,因此我遇到了使用 SecurityManager 的问题。
我正在像这样加载 jar 文件(硬编码文件示例):
URLClassLoader clsLoader = URLClassLoader
.newInstance(new URL[] { new URL("file:/C://Temp/SettingsApp.jar") });
Class<?> cls = clsLoader.loadClass("iezon.app.SettingsApp");
JPanel settingsApp = (JPanel) cls.newInstance();
我曾尝试像这样使用SecurityManager:
try {
SecurityManager sm = new SecurityManager();
Object context = sm.getSecurityContext();
sm.checkPermission(new AllPermission(), context);
settingsAppPanel = (JPanel) cls.newInstance();
} catch (AccessControlException e) {
e.printStackTrace();
}
AllPermission() 的测试有效并给了我这个例外:
java.security.AccessControlException: 访问被拒绝 ("java.security.AllPermission" "" "")
但是,我找不到有关如何将 jar 文件绑定到此安全管理器而不是当前平台的任何信息。我只是不希望 jar 文件能够在不首先请求用户可以接受的权限的情况下打开套接字等。
我偶然发现了BasicPermission,但是,这是一个抽象类,不能像AllPermission 那样被实例化,同样,我无法找到任何有关处理此问题的信息。任何帮助将不胜感激!
【问题讨论】:
-
似乎存在一个根本性的误解。无论您是否在某处调用
sm.checkPermission(new AllPermission(), context);,都与安全性无关。所以用另一种权限替换AllPermission是没有用的。要使用安全管理器,您必须通过System.setSecurityManager(…)或通过启动选项安装它。此外,您必须决定是要实现安全管理器还是使用标准安全管理器并编写策略文件。无论哪种情况,您都不必实例化权限对象。 -
我根据您@Holger 的评论回答了这个问题
标签: java reflection securitymanager