首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SecurityManager启用AllPermission

使用SecurityManager启用AllPermission
EN

Stack Overflow用户
提问于 2018-11-04 16:48:56
回答 3查看 2.4K关注 0票数 13

我试图让自己熟悉SecurityManager,但是即使这个简单的场景也失败了。当我从IDE内部或命令行运行以下代码时,我会得到以下异常

代码语言:javascript
复制
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()

同样的误解似乎也发生在以下代码上:

代码语言:javascript
复制
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表示的域所拥有的权限的交集执行的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-07 10:53:43

我能够在Policy.getPolicy()调用之前用额外的setSecurityManager()重新创建您的情况,原因是使用get策略调用,您将触发默认策略创建,并且设置来自java.policy的权限,但是如果没有setSecurityManager(),它们就不会被激活,这就是当您执行自定义AllPermission策略集时仍然会遇到"java.util.PropertyPermission" "java.home" "read"问题的原因,因为许多这样的默认策略不会被set策略覆盖。非常混乱的结构。

代码语言:javascript
复制
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")'

但如果您使用以下自定义策略;

代码语言:javascript
复制
Policy allPermissionPolicy = new Policy() {

    @Override
    public boolean implies(ProtectionDomain domain, Permission permission) {
        return true;
    }
};

它覆盖所有权限定义,并允许所有操作通过,这是解决这种混淆的可能方法。

票数 15
EN

Stack Overflow用户

发布于 2018-11-07 10:41:03

您在哪个上下文中运行上面的代码?

使用简单的JVM或运行在某个JavaEE容器之上的webapp中的命令行?在哪个操作系统上?用哪个JVM (甲骨文,OpenJDK,IBM J9.)哪种版本?

如果您从命令行运行,请查看位于JVM安装路径中的java.policy文件。它的内容可能会缩小您的授权范围,从而阻止您访问这个特定的系统变量?

票数 1
EN

Stack Overflow用户

发布于 2022-08-02 23:04:18

最后,如果您需要允许一切的SecurityManager,只需使用以下命令:

代码语言:javascript
复制
System.setSecurityManager(new SecurityManager() {
    @Override
    public void checkPermission(Permission perm) {
    }

    @Override
    public void checkPermission(Permission perm, Object context) {
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53143074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档