Я пытаюсь ознакомиться с 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