在运行时更改安全策略属性

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")