在运行时更改安全策略属性
Changing security policy properties at runtime
这是我的政策文件
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"
我期待在代码段 2 的最后一行出现 AccessControlException
。有任何指示吗?
当安全性 API 在 JDK 1.0 和 JDK 1.1 之间被重新设计时,SecurityManager
class 的直接实例变成了外观。检查方法委托给 AccessController.checkPermission(…)
并构造 SecurityManager
的新实例根本没有效果,因为这些对象不封装任何状态。
AccessController
class in turn delegates to the current 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";
到您的初始策略文件,您会在第二次调用 checkCreateClassLoader()
时获得所需的 java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader")
。
这是我的政策文件
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"
我期待在代码段 2 的最后一行出现 AccessControlException
。有任何指示吗?
当安全性 API 在 JDK 1.0 和 JDK 1.1 之间被重新设计时,SecurityManager
class 的直接实例变成了外观。检查方法委托给 AccessController.checkPermission(…)
并构造 SecurityManager
的新实例根本没有效果,因为这些对象不封装任何状态。
AccessController
class in turn delegates to the current 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";
到您的初始策略文件,您会在第二次调用 checkCreateClassLoader()
时获得所需的 java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader")
。