我正在努力熟悉SecurityManager
,但是即使是这个简单的场景也失败了。 当我从我的IDE内部或命令行运行以下内容时,我会得到以下异常;
access denied ("java.util.PropertyPermission" "java.home" "read")
我认为这段代码已经允许了一切:
这与JVM导出的策略有关吗? 我该如何干净地
Policy.setPolicy(new Policy() { @Override public PermissionCollection getPermissions(CodeSource codesource) { Permissions perm = new Permissions(); perm.add(new AllPermission()); return perm; } }); System.setSecurityManager(new SecurityManager()); System.out.println(System.getProperty("java.home"));
setPolicy()
?对于以下代码,同样会发生误解:
System.setSecurityManager(new SecurityManager()); final Permissions allPermission = new Permissions(); allPermission.add(new AllPermission()); AccessController.doPrivileged((PrivilegedAction<Void>) () -> { System.out.println(System.getProperty("java.home")); return null; }, new AccessControlContext(new ProtectionDomain[]{new ProtectionDomain(null, allPermission)}));
更新:第二种情况是可以理解的,因为提供的权限只是进一步的限制:(javadoc)该操作是在调用者保护域所拥有的权限和由指定的
AccessControlContext
表示的域所拥有的权限的交集下执行的。
main
方法内运行,通过普通的java -cp <classpath> <main-class>
启动)。我没有修改我的 .policy 文件,因为最终它并不重要--一旦Policy.setPolicy
返回,就会咨询 您 的策略实现,而不是以前的、默认的、文件支持的那个。你可以尝试使用-Djava.security.debug="access,failure"
运行并将其输出附加到你的问题上。 - Uux