Я пытаюсь познакомиться с SecurityManager
, но даже этот простой сценарий терпит неудачу. Когда я запускаю следующее изнутри своей IDE или из командной строки, я получаю следующее исключение ;
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