Java System.setSecurityManager() 不适用于策略文件
Java System.setSecurityManager() doesn't work well with policy file
我预计,当使用 System.setSecurityManager() + 策略文件时,它应该可以工作。
这里我有一个 intelliJ 项目,file/directory 结构如下:
--src
--main
--java
--TestPrinciple.java
--resources
--demo.policy
然后是我的代码:
public class TestPrincipal {
public static void main(String[] args) {
System.setProperty("java.security.policy", "demo.policy");
System.setProperty("java.security.auth.login.config", "demo.config");
System.out.println(System.getProperty("java.home"));
System.setSecurityManager(new SecurityManager());
}
}
而 demo.policy 是:
grant {
permission java.util.PropertyPermission "java.home", "read";
};
运行异常:
Exception in thread "main" java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.security.policy" "write")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.System.setProperty(System.java:792)
at TestPrincipal.main(TestPrincipal.java:6)
推测 demo.policy
不允许 类 设置系统属性的权限。
还值得注意的是,代码在安全管理器初始化后设置安全管理器的配置。
简单的解决方案是最后设置安全管理器。
我预计,当使用 System.setSecurityManager() + 策略文件时,它应该可以工作。
这里我有一个 intelliJ 项目,file/directory 结构如下:
--src
--main
--java
--TestPrinciple.java
--resources
--demo.policy
然后是我的代码:
public class TestPrincipal {
public static void main(String[] args) {
System.setProperty("java.security.policy", "demo.policy");
System.setProperty("java.security.auth.login.config", "demo.config");
System.out.println(System.getProperty("java.home"));
System.setSecurityManager(new SecurityManager());
}
}
而 demo.policy 是:
grant {
permission java.util.PropertyPermission "java.home", "read";
};
运行异常:
Exception in thread "main" java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.security.policy" "write")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.System.setProperty(System.java:792)
at TestPrincipal.main(TestPrincipal.java:6)
推测 demo.policy
不允许 类 设置系统属性的权限。
还值得注意的是,代码在安全管理器初始化后设置安全管理器的配置。
简单的解决方案是最后设置安全管理器。