Вопрос о политике Java SocketPermission - PullRequest
3 голосов
/ 12 ноября 2010

У меня есть клиентская и серверная программа, которая пытается связаться друг с другом.В моем файле политики для сервера я указал следующее:

grant signedBy "vivin" {
  permission java.io.FilePermission "-", "read, write";
  permission java.net.SocketPermission "localhost:2220-2230", "accept, connect, listen, resolve", signedBy "vivin";
};

И в файле политики моего клиента у меня есть:

grant signedBy "vivin" {
  permission java.net.SocketPermission "localhost:2220-2230", "accept, connect, listen, resolve", signedBy "vivin";
};

Я запускаю свой сервер, и он слушаетна порту 2225. Затем я запускаю свой клиент, и он пытается подключиться к серверу, который прослушивает порт 2225. К сожалению, я получаю эту ошибку на сервере:

[java] Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:45944 accept,resolve)
[java]  at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
[java]  at java.security.AccessController.checkPermission(AccessController.java:546)
[java]  at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
[java]  at java.lang.SecurityManager.checkAccept(SecurityManager.java:1157)
[java]  at java.net.ServerSocket.implAccept(ServerSocket.java:457)
[java]  at java.net.ServerSocket.accept(ServerSocket.java:421)

Номер порта постоянно меняется;Я предполагаю, что это номер порта для клиента (где сервер подключается обратно к клиенту?).Это верно?Для этого назначения существует ограничение, указанное для номеров портов:

Ваш клиент и сервер должны использовать диспетчер безопасности Java, и ваш проект должен включать файлы политики для каждого, который определяет необходимые разрешения для нихбежать.Разрешите вашему серверу и клиенту связываться друг с другом на локальном хосте, используя порты в диапазоне 2220-2230 .

Как я могу соблюдать это ограничение?Или это относится только к порту, который слушает сервер?Я полагаю, что смогу заставить его работать, если я дам разрешения accept и resolve для портов больше 2231. Но я не знаю, противоречит ли это ограничению.

1 Ответ

5 голосов
/ 12 ноября 2010

Поскольку клиент выбирает свой локальный порт TCP случайным образом (я полагаю), вы должны дать ему соответствующее разрешение:

grant signedBy "vivin" {
  permission java.net.SocketPermission "localhost:1024-", "connect, resolve", signedBy "vivin";
};

Клиент не прослушивает входящие соединения и не нуждается в разрешениях для «прослушивания»"и" принять ".На сервере вы, скорее всего, можете отказаться от разрешения на «подключение», если сервер не устанавливает исходящее TCP-соединение.

...