这是我的政策文件
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
。有指针吗?
答案 0 :(得分:2)
当在JDK 1.0和JDK 1.1之间重新设计安全API时,SecurityManager
类的直接实例成为外观。检查方法委托给AccessController.checkPermission(…)
并构造SecurityManager
的新实例完全没有效果,因为这些对象不封装任何状态。
AccessController
class依次委派给当前的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()
。