Java RMI AccessControlException: доступ запрещен

Эй, я получаю AccessControlException: access denied при попытке запустить приложение RMI, которое я пишу, я не могу понять, почему я получаю это исключение, если я открываю его на порту по умолчанию 1099 или на другом динамическом порту, мой файл политики в настоящее время предоставляет все (изменится, когда приложение будет завершено).

Я застрял в том, где это происходит не так, любая помощь будет очень полезна

Мой код

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
     if (System.getSecurityManager() == null)
     {
        System.setSecurityManager ( new RMISecurityManager() );
     }

     CreditCardServer ccs = new CreditCardServer();

     int port = 1099;

     try {
        port = Integer.valueOf(args[0]);
        }
     catch (Exception e)
        {
        System.out.println("Invlaid Port");
        }

     if (((port <= 65535) && (port >= 49152)) || port ==1099)
     {
     System.out.println("Valid Port");
     }
     else
     {
         port = 1099;
        System.out.println("Port not in Dynamic Range 49152<-->65535");
     }

     System.out.println(port);

     LocateRegistry.createRegistry(port);

     LocateRegistry.getRegistry().bind("CreditCardServer", ccs);

     while (true)
     {
        //hum?
     }
}

}

Трассировка стека

vega3 [ia32.linux] 23% java -Djava.security.policy=wideopen.policy -jar "BookStore-CreditCardServer.jar 65000"

Действительный порт

65000

Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342)
        at java.security.AccessController.checkPermission(AccessController.java:553)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
        at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051)
        at java.net.Socket.connect(Socket.java:536)
        at java.net.Socket.connect(Socket.java:492)
        at java.net.Socket.<init>(Socket.java:389)
        at java.net.Socket.<init>(Socket.java:203)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
        at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
        at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
        at bookstorecreditcardserver.Main.main(Main.java:56)

Мой файл политики

grant {
// Allow everything for now
permission java.security.AllPermission;
};

person Gwilym    schedule 11.03.2010    source источник
comment
Можете ли вы сделать nmap на своем компьютере, чтобы убедиться, что что-то еще не использует этот порт (например, вы запускали эту программу раньше, и она не умерла чисто).   -  person Dave    schedule 11.03.2010


Ответы (3)


Я застрял на этом весь день (после выяснения того, что мне пришлось запускать rmiregistry из командной строки), пытаясь заставить это работать локально с Eclipse, и, наконец, решил это. Несколько советов, как спасти других от этой жестокой участи:

1 - правильно назначить файл политики, либо с флагом командной строки:

java -Djava.security.policy=/home/.../<filename>.policy ...

или поместив это прямо в свой код:

System.setProperty("java.security.policy","file:///home/.../<filename>.policy");

Вы также можете поместить его в ту же папку, что и корень вашего проекта), чтобы уменьшить URI до

file:./<filename>.policy

(используйте относительный URI вместо абсолютного - я действительно не понимал этого до сегодняшнего дня).

2 - убедитесь, что формат файла политики правильный, например:

grant codeBase "file:<path>/bin/-" {
    permission java.security.AllPermission;
};

Это должно относиться к папке, в которой находится ваш двоичный файл! Подробное объяснение формата файла политики можно найти здесь< /а>.

Вот и все, я также рекомендую это руководство, я нашел его очень помогает встать на верный путь.

person Dining Philosopher    schedule 14.04.2012
comment
+1 Спасибо за этот обширный ответ на этот старый, но все еще очень актуальный вопрос Nauta & wecome. - person Maarten Bodewes; 08.05.2012
comment
Объяснение формата ссылки на файл политики устарело. - person BlueDolphin; 02.01.2015
comment
Как мне получить правильный путь для файла security.policy? - person CodyBugstein; 02.10.2015

По сути, я глуп, я предположил, что, поскольку Java не жаловался, он находил файл .policy AOK, оказывается, он не перемещал новую копию файла .policy в рабочий каталог, решает все :-D

person Gwilym    schedule 11.03.2010

Я нашел большинство ответов на эту тему расплывчатыми и бесполезными и потратил несколько часов на отладку. Скорее всего, ваша ошибка связана с тем, что файл политики либо неправильно отформатирован, либо вы неправильно задали его в качестве аргумента командной строки.

Если вы получаете java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")

  1. Создайте файл политики безопасности со всеми разрешениями, просто чтобы протестировать его.

grant codeBase "file:/-" { permission java.security.AllPermission; };

  1. Используйте этот файл безопасности как для клиента, так и для сервера, просто чтобы он работал.

  2. Убедитесь, что у вас нет опечаток. Я часами пытался понять, почему это не работает, и набрал -Djava.rmi.security.policy вместо -Djava.security.policy=...

Для тех из нас, кто просто хочет запустить и запустить руководство по RMI от Oracle, этой политики безопасности будет более чем достаточно для этого примера.

person Peter Kaminski    schedule 15.02.2018
comment
Ваш ответ в основном идентичен этому, который был опубликован шесть лет назад и который не является ни расплывчатым, ни бесполезным. Или у вас тоже. - person user207421; 15.02.2018
comment
Потратив часы на отладку этого, я могу заверить вас, что для этой проблемы должно быть больше ответов. Я обнаружил, что эта строка особенно сильно усложняет проблему. Это должно относиться к папке, в которой находится ваш двоичный файл! - person Peter Kaminski; 15.02.2018