Java System.setSecurityManager() 不适用于策略文件

Posted

技术标签:

【中文标题】Java System.setSecurityManager() 不适用于策略文件【英文标题】:Java System.setSecurityManager() doesn't work well with policy file 【发布时间】:2018-12-12 08:40:10 【问题描述】:

我希望,当使用 System.setSecurityManager() + 策略文件时,它应该可以工作。

我有一个 intelliJ 项目,文件/目录结构如下:

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

【问题讨论】:

rmi java.security.policy access denied的可能重复 那个帖子对我不起作用 【参考方案1】:

大概demo.policy 不允许类权限设置系统属性。

另外值得注意的是,在初始化安全管理器之后,代码设置了安全管理器的配置。

简单的解决方案是最后设置安全管理器。

【讨论】:

我一时糊涂了。您已更改问题中的代码。将两个版本放在一起,您似乎有一个允许代码设置安全管理器的设置,但如果您不这样做,现有的安全管理器会阻止代码设置系统属性。行号的变化也有点奇怪。

以上是关于Java System.setSecurityManager() 不适用于策略文件的主要内容,如果未能解决你的问题,请参考以下文章

Java Math

Java 布尔运算

java [Java] Java常用代码#java

Java - 35 Java 实例

Java While 循环

Java 字符串