我正在尝试使自己熟悉SecurityManager
,但即使是这种简单的情况也无法实现。当我从IDE内部或从命令行运行以下命令时,将得到以下exception;
access denied ("java.util.PropertyPermission" "java.home" "read")
我以为我可以使用此代码进行所有操作:
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"));
这与JVM派生的策略有关吗?我如何干净地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
答案 0 :(得分:11)
在Policy.setPolicy()
调用之前,我能够用额外的Policy.getPolicy()
重新创建您的案例,它影响行为的原因是,通过get策略调用,您触发了默认策略创建,并且设置了java.policy
的权限,但是没有激活setSecurityManager()
,这就是为什么您执行自定义AllPermission
策略集时仍然遇到"java.util.PropertyPermission" "java.home" "read"
问题的原因,因为许多此类默认策略不会被设置策略覆盖。确实非常令人困惑。
Policy.getPolicy();
Policy.setPolicy(policyWithAllPermission);
System.setSecurityManager(new SecurityManager());
System.out.println(System.getProperty("java.home"));
// results in 'access denied ("java.util.PropertyPermission" "java.home" "read")'
但是,如果您使用以下自定义政策;
Policy allPermissionPolicy = new Policy() {
@Override
public boolean implies(ProtectionDomain domain, Permission permission) {
return true;
}
};
它会覆盖所有权限定义,并允许所有操作通过,以解决此混乱情况。
答案 1 :(得分:1)
您在哪种情况下在上面运行代码?
是从命令行使用简单的JVM还是在某些JavaEE容器上运行的Webapp中?在哪个操作系统上?哪个JVM(Oracle,OpenJDK,IBM J9 ...)和哪个版本?
如果从命令行运行,请查看JVM安装路径中的java.policy
文件。它的内容可能会缩小您的资助范围,从而阻止您访问此特定系统变量?