Изменение свойств политики безопасности во время выполнения
Вот мой файл политики
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()
.