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

时间:2020-06-24 14:58:44

标签: java java-14

这是我的政策文件

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。有指针吗?

1 个答案:

答案 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()