我试图让自己熟悉SecurityManager,但是即使这个简单的场景也失败了。当我从IDE内部或命令行运行以下代码时,我会得到以下异常;
access denied ("java.util.PropertyPermission" "java.home" "read")我以为我允许这段代码的所有内容:
System.out.println(System.getProperty("java.home"));Policy.setPolicy(新策略(){@覆盖公共PermissionCollection getPermissions(CodeSource codesource) ){codesource perm =新权限();perm.add(新AllPermission());返回perm;});System.setSecurityManager(新SecurityManager());
这与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)}));Update:第二种情况是可以理解的,因为提供的权限只是进一步的限制:(javadoc)操作是与调用方的保护域拥有的权限和由指定的AccessControlContext表示的域所拥有的权限的交集执行的。
发布于 2018-11-07 10:53:43
我能够在Policy.getPolicy()调用之前用额外的setSecurityManager()重新创建您的情况,原因是使用get策略调用,您将触发默认策略创建,并且设置来自java.policy的权限,但是如果没有setSecurityManager(),它们就不会被激活,这就是当您执行自定义AllPermission策略集时仍然会遇到"java.util.PropertyPermission" "java.home" "read"问题的原因,因为许多这样的默认策略不会被set策略覆盖。非常混乱的结构。
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;
}
};它覆盖所有权限定义,并允许所有操作通过,这是解决这种混淆的可能方法。
发布于 2018-11-07 10:41:03
您在哪个上下文中运行上面的代码?
使用简单的JVM或运行在某个JavaEE容器之上的webapp中的命令行?在哪个操作系统上?用哪个JVM (甲骨文,OpenJDK,IBM J9.)哪种版本?
如果您从命令行运行,请查看位于JVM安装路径中的java.policy文件。它的内容可能会缩小您的授权范围,从而阻止您访问这个特定的系统变量?
发布于 2022-08-02 23:04:18
最后,如果您需要允许一切的SecurityManager,只需使用以下命令:
System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission perm) {
}
@Override
public void checkPermission(Permission perm, Object context) {
}
});https://stackoverflow.com/questions/53143074
复制相似问题