Включите Java SecurityManager с помощью AllPermission
Я пытаюсь познакомиться с 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
3 ответа
Я смог воссоздать ваше дело с дополнительным Policy.getPolicy()
до Policy.setPolicy()
причина, по которой это влияет на поведение, заключается в том, что при вызове политики get вы инициируете создание политики по умолчанию и 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")
Но если вы используете следующую пользовательскую политику;
Policy allPermissionPolicy = new Policy() {
@Override
public boolean implies(ProtectionDomain domain, Permission permission) {
return true;
}
};
По сути, он переопределяет все определения разрешений и позволяет всем действиям исправить возможную путаницу.
В каком контексте вы запускаете свой код выше?
из командной строки с простой JVM или внутри веб-приложения, запущенного поверх какого-то контейнера JavaEE? На какой ОС? с какой JVM (Oracle, OpenJDK, IBM J9...) и какой версией?
Если вы работаете из командной строки, посмотрите на java.policy
файл находится в вашем пути установки JVM. Его содержание может сузить ваши гранты и, таким образом, помешать вам получить доступ к этой конкретной системной переменной?
В конце концов, если вам нужен SecurityManager, который позволит все, просто используйте это:
System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission perm) {
}
@Override
public void checkPermission(Permission perm, Object context) {
}
});