带有SecurityManager策略文件的Java Shipping JAR

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有SecurityManager策略文件的Java Shipping JAR相关的知识,希望对你有一定的参考价值。

我正在尝试发布一个执行一些RMI调用的Java应用程序。

我需要将它作为一个JAR文件发送(这是一个要求,没有办法解决它)。

现在,为了允许某些东西(比如套接字和RMI连接),我需要一个SecurityManager和一个Policy文件。

我想在jar中发送此策略文件,并从JAR内部设置策略路径。

现在,这就是我的代码:

public static void main(String[] args)
{
        System.setProperty("java.security.policy","jar:file:/Policies/Server.policy");
        Policy.getPolicy().refresh();

        ... /* All other code */

}

当我将路径更改为我的PC上的路径并运行没有JAR的代码(一个IntelliJ'应用程序')时,启动我的应用程序没有问题,当我尝试运行我的JAR时,我得到以下异常:

Exception in thread "main" java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:2000" "listen,resolve")

我有一种感觉,我设置的路径是错误的,任何人都可以告诉我这条路应该是什么?

答案

通过将我的代码更改为以下内容,我能够解决此问题:

public static void main(String[] args)
{
    boolean quit = false;

    String serverPolicyPath = "/Policies/Server.policy";
    URL serverPolicyURL = Main.class.getResource(serverPolicyPath);

    if (serverPolicyURL == null)
    {
        System.err.println("getResource returned NULL");
        return;
    }

    System.setProperty("java.security.policy",serverPolicyURL.toString());
    Policy.getPolicy().refresh();

    ...

我没有试图手动找出路径,而是让Java为我修复它。

以上是关于带有SecurityManager策略文件的Java Shipping JAR的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 Java SecurityManager 以允许从给定文件中读取所有属性

带有 SecurityManager 的 Constructor.newInstance 与 Class.newInstance

JAVA SecurityManager - 具有多个操作的自定义 BasicPermission

shiro学习笔记_0300_jdbcRealm和认证策略

java.policy文件

关于Shiro的认证策略