Изменение свойств политики безопасности во время выполнения

Вот мой файл политики

grant {
    permission java.util.PropertyPermission "*", "read,write";
    permission java.lang.RuntimePermission "createClassLoader";
    permission java.lang.RuntimePermission "setSecurityManager";
    permission java.lang.RuntimePermission "createSecurityManager";
};

Вот тестовый пример:

System.setProperty("java.security.policy", SECURITY_POLICY_BASEDIR + "/create-classloader.policy");
System.setSecurityManager(new SecurityManager());
System.getSecurityManager().checkCreateClassLoader();

System.setProperty("java.security.policy", "default"); // change policy at runtime
System.setSecurityManager(new SecurityManager());
System.getSecurityManager().checkCreateClassLoader(); // expecting a "AccessControlException"

Я жду AccessControlException в последней строке фрагмента 2. Есть указатели?

1 ответ

Решение

Когда API безопасности был переработан между JDKÂ 1.0 и JDKÂ 1.1, прямые экземпляры SecurityManagerкласс стал фасадом. Методы проверки делегируют AccessController.checkPermission(…) и создание нового экземпляра SecurityManager не имеет никакого эффекта, поскольку эти объекты не инкапсулируют какое-либо состояние.

В AccessControllerкласс, в свою очередь, делегирует текущему Policy. Политики могут измениться; есть такжеrefresh()для перезагрузки текущего файла политики. Но доступ кPolicy требует дополнительных разрешений.

Поэтому, когда вы меняете свой код на

System.setProperty("java.security.policy", SECURITY_POLICY_BASEDIR + "/create-classloader.policy");
System.setSecurityManager(new SecurityManager());
System.getSecurityManager().checkCreateClassLoader();

System.setProperty("java.security.policy", "default"); // change policy at runtime
Policy.getPolicy().refresh();
System.getSecurityManager().checkCreateClassLoader(); // expecting a "AccessControlException"

и добавьте строку

    permission java.security.SecurityPermission "getPolicy";

в исходный файл политики, вы получите желаемый java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader") при втором вызове checkCreateClassLoader().

Другие вопросы по тегам