Kar*_*ell 11 java securitymanager java-security
我试图让自己熟悉,SecurityManager但即使这个简单的场景也失败了.当我从IDE或命令行中运行以下内容时,我得到以下异常 ;
access denied ("java.util.PropertyPermission" "java.home" "read")
Run Code Online (Sandbox Code Playgroud)
我以为我用这段代码允许了所有内容:
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"));
这与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)
它会覆盖所有权限定义,并允许所有操作通过,这可能会解决这种混淆.
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |