Java Учебное руководство RMI - AccessControlException: доступ запрещен (java.io. FilePermission

15
задан Robert Harvey 19 September 2011 в 05:00
поделиться

4 ответа

Хорошо, у меня есть он. Это wasn´ t rmiregistry свойство (работает без любых параметров). В моем VM-параметре кодовой базы было две ошибки:

-cp C:\ProjX\server\serverProj\bin\usermanager\
-Djava.rmi.server.codebase=file://C:/ProjX/server/serverProj/bin/usermanager/
-Djava.rmi.server.hostname=XYZ (anonymized)
-Djava.security.policy=server.policy

... должен вместо этого быть похожим на это:

-Djava.rmi.server.codebase=file:/C:/ProjX/server/serverProj/bin/
-Djava.rmi.server.hostname=XYZ (anonymized)
-Djava.security.policy=server.policy

=> file:/ (только одна наклонная черта) + неправильное окончание пакета.

, Но трассировка так сбивало с толку, моя первая мысль была, что что-то должно быть неправильным с файлом политики или конфигурацией политики.

, Тем не менее: Спасибо за справку и счастливое взламывание. ;-)

7
ответ дан 1 December 2019 в 04:18
поделиться

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

Назад к вопросу...

-Djava.rmi.server.codebase=file://C:/ProjX/server/serverProj/bin/usermanager/

, Который должен быть или "file:///C:/..." или "file:/C:/...". Думайте о http. "http://C:/..." относится к хосту, названному C. Обратите внимание, что сообщение об исключении отбросило двоеточие, потому что это - просто синтаксис для номера порта.

причина, почему Вы получаете исключение безопасности даже при предоставлении разрешений ко всему коду состоит в том, что RMI ограничивает полномочия этим соответствующим, учитывая включенные URL (использование AccessController doPrivileged две формы аргумента).

7
ответ дан 1 December 2019 в 04:18
поделиться

Я думаю, что исключение на самом деле выходит из rmiregistry. Эта часть отслеживания стека - то, что заставляет меня думать так. Тупик для rmiregistry получает исключение и пасует назад его как результат попытки снова переплести.

    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
    at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)

Попытка, работающая rmiregistry с -J-Djava.security.policy=all.policy, где файл политики дает все разрешения (по крайней мере, для получения вещей, идущих).

В конечном счете можно также хотеть переключиться на URL кодовой базы HTTP, именно так что можно выполнить клиенты на машине, отдельной от сервера.

0
ответ дан 1 December 2019 в 04:18
поделиться

Можно также установить программно java.rmi.server.codebase свойство:

Hello h = null;
Properties props = System.getProperties();
System.setProperty("java.rmi.server.codebase", "file:/C:/PROJECTX/bin/");
try {
  h = new HelloImpl();
  Naming.bind("//localhost:1099/HelloService", h);
  System.out.println("Serwis gotów...");
} catch (RemoteException e) {
  e.printStackTrace();
} catch (MalformedURLException e) {
  e.printStackTrace();
} catch (AlreadyBoundException e) {
  e.printStackTrace();
}

для немного гипотетических Hello сервис RMI.

2
ответ дан 1 December 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: