Включите Java SecurityManager с помощью AllPermission - PullRequest
0 голосов
/ 04 ноября 2018

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

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Мне удалось воссоздать ваше дело с дополнительными 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")'

Но если вы используете следующую пользовательскую политику;

Policy allPermissionPolicy = new Policy() {

    @Override
    public boolean implies(ProtectionDomain domain, Permission permission) {
        return true;
    }
};

Он переопределяет все определения разрешений и позволяет всем действиям исправить возможную путаницу.

0 голосов
/ 07 ноября 2018

В каком контексте вы запускаете свой код выше?

из командной строки с простой JVM или внутри веб-приложения, запущенного поверх какого-то контейнера JavaEE? На какой ОС? с какой JVM (Oracle, OpenJDK, IBM J9 ...) и какой версией?

Если вы работаете из командной строки, взгляните на файл java.policy, расположенный в пути установки JVM. Его содержание может сузить ваши гранты и, следовательно, помешать вам получить доступ к этой конкретной системной переменной?

...