使用 logback 的 java.security.policy 问题

发布于 2024-12-13 22:12:51 字数 1593 浏览 3 评论 0原文

以下代码使用 LOG4J(和 SLF4J)运行文件:

package test; 

import java.rmi.RMISecurityManager; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

    public class TestMain { 
    private static final Logger logger = LoggerFactory.getLogger(TestMain.class); 
    public static void main(String[] args) throws Exception { 
        System.setProperty("java.security.policy", "./src/main/config/java.policy"); 
        logger.debug("Policy location: {}", System.getProperty("java.security.policy")); 
        if (System.getSecurityManager() == null) { 
            System.setSecurityManager(new RMISecurityManager()); 
        } 
        System.setProperty("java.security.policy", "./src/main/config/java.policy"); 
    } 
}

当将依赖项切换为“logback”而不是 log4j 时,它会给出:

01:05:37.702 [main] DEBUG test.TestMain - Policy location: ./src/main/config/java.policy 
Exception in thread "main" java.security.AccessControlException: access denied (java.util.PropertyPermission java.security.policy write) 
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) 
at java.security.AccessController.checkPermission(AccessController.java:546) 
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
at java.lang.System.setProperty(System.java:725) 
at test.TestMain.main(TestMain.java:18) 

在 main 方法的最后一行。

java.policy 文件的内容:

grant { 
    permission java.security.AllPermission; 
}; 

将 java.policy 文件放入“$JAVA_HOME/jre/lib/security”中可以解决该问题。

谁能告诉我发生了什么事?

The following code runs file using LOG4J (and SLF4J):

package test; 

import java.rmi.RMISecurityManager; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

    public class TestMain { 
    private static final Logger logger = LoggerFactory.getLogger(TestMain.class); 
    public static void main(String[] args) throws Exception { 
        System.setProperty("java.security.policy", "./src/main/config/java.policy"); 
        logger.debug("Policy location: {}", System.getProperty("java.security.policy")); 
        if (System.getSecurityManager() == null) { 
            System.setSecurityManager(new RMISecurityManager()); 
        } 
        System.setProperty("java.security.policy", "./src/main/config/java.policy"); 
    } 
}

When switching the dependencies to "logback" instead of log4j, it gives:

01:05:37.702 [main] DEBUG test.TestMain - Policy location: ./src/main/config/java.policy 
Exception in thread "main" java.security.AccessControlException: access denied (java.util.PropertyPermission java.security.policy write) 
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) 
at java.security.AccessController.checkPermission(AccessController.java:546) 
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
at java.lang.System.setProperty(System.java:725) 
at test.TestMain.main(TestMain.java:18) 

at the last line of the main method.

The contents of the java.policy file:

grant { 
    permission java.security.AllPermission; 
}; 

Putting the java.policy file inside "$JAVA_HOME/jre/lib/security" solves the issue.

Anyone can tell me what's happening?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蓝眸 2024-12-20 22:12:51

我发现我们有 3 个选项可以解决这个问题:

1) 在初始化记录器之前初始化 SecurityManager
2) 将 $JAVA_HOME/jre/lib/security 中的 java.policy 替换为你的
3) 启动应用程序时将 java.policy 的位置作为系统属性传递:-Djava.security.policy=java.policy

I found out that we have 3 options to work around this:

1) Initialize the SecurityManager before initializing a logger
2) Replace the java.policy inside $JAVA_HOME/jre/lib/security with yours
3) Pass java.policy's location as a system property when starting the app: -Djava.security.policy=java.policy

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文