1

这是我的政策文件

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 的最后一行出现。任何指针?

4

1 回答 1

2

当 JDK 1.0 和 JDK 1.1 之间的安全 API 被重新设计时,SecurityManager类的直接实例变成了外观。检查方法委托给AccessController.checkPermission(…)并构造一个新的实例SecurityManager根本没有效果,因为这些对象不封装任何状态。

该类依次委托给当前AccessControllerPolicy. 政策可以改变;还有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().

于 2020-06-24T17:39:22.647 回答