【问题标题】:Changing security policy properties at runtime在运行时更改安全策略属性
【发布时间】:2020-06-24 14:58:44
【问题描述】:

这是我的政策文件

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"

我期待在 sn-p 2 的最后一行出现AccessControlException。有任何指针吗?

【问题讨论】:

  • 在上面的代码之后,尝试加载一个不属于JDK的类。然后你应该得到AccessControlException。至少我尝试时是这样。
  • 很抱歉这么说,但这对我来说没有意义。
  • 当您的 java 代码尝试加载类时,将查询您设置的策略,因为您正在通过方法 checkCreateClassLoader() 设置类加载器策略。仅仅设置策略没有任何作用。你试过我的建议了吗?
  • 是的,它返回“访问被拒绝”但带有accessDeclaredMembers。我希望它是createClassLoader 错误。问题很简单,“我们可以在运行时更改它吗?”

标签: java java-14


【解决方案1】:

在 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";

在您的初始策略文件中,您会在第二次调用 checkCreateClassLoader() 时获得所需的 java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader")

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多