使用AllPermission启用Java SecurityManager

Kar*_*ell 11 java securitymanager java-security

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

access denied ("java.util.PropertyPermission" "java.home" "read")
Run Code Online (Sandbox Code Playgroud)

我以为我用这段代码允许了所有内容:

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"));
Run Code Online (Sandbox Code Playgroud)

这与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)}));
Run Code Online (Sandbox Code Playgroud)

更新:第二种情况是可以理解的,因为提供的权限只是一个进一步的限制:(javadoc)操作是通过调用者保护域拥有的权限与指定的域所拥有的权限的交集来执行的.AccessControlContext

bur*_*ete 12

我能够Policy.getPolicy()Policy.setPolicy()调用之前用额外的内容重新创建你的案例,它影响行为的原因是,使用get policy调用,触发默认策略创建,并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")'
Run Code Online (Sandbox Code Playgroud)

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

Policy allPermissionPolicy = new Policy() {

    @Override
    public boolean implies(ProtectionDomain domain, Permission permission) {
        return true;
    }
};
Run Code Online (Sandbox Code Playgroud)

它会覆盖所有权限定义,并允许所有操作通过,这可能会解决这种混淆.

  • 事实证明,您从一开始就凭直觉走在正确的轨道上(额外的功劳是在评论中在“setPolicy”之外和之前捕获了 OP 的调用“getPolicy”的参考)!至于故事的*“为什么,确切地”* 部分,请参阅`java.security.Policy#initPolicy` 的来源。 (2认同)