2014-12-01 6 views
2

У меня есть серьезная проблема с Java Web Start, что я не могу опустить голову. Ситуация такова: у меня есть приложение JavaFX, написанное Java8, которое я хочу развернуть с помощью Java WebStart. До недавнего времени я использовал HTTP для связи с сервером, и все работало нормально. Я мог бы развернуть приложение, используя веб-запуск, встроенный в браузер или как отдельное приложение.Как предоставить зависимый lib в файле jnlp все разрешения?

Однако я изменил связь с использованием WebSockets. Для этого в настоящее время я использую реализацию tyrus. И теперь возникает проблема: Так как я добавил Тире LIB, я всегда получаю AccessControlException когда Тир пытается получить доступ к системным свойством:

Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "weblogic.websocket.client.max-aio-threads" "read") 
at java.security.AccessControlContext.checkPermission(Unknown Source) ~[na:1.8.0_25] 
at java.security.AccessController.checkPermission(Unknown Source) ~[na:1.8.0_25] 
at java.lang.SecurityManager.checkPermission(Unknown Source) ~[na:1.8.0_25] 
at sun.plugin2.applet.FXAppletSecurityManager.checkPermission(Unknown Source) ~[na:na] 
at java.lang.SecurityManager.checkPropertyAccess(Unknown Source) ~[na:1.8.0_25] 
at java.lang.System.getProperty(Unknown Source) ~[na:1.8.0_25] 
at org.glassfish.tyrus.container.jdk.client.JdkClientContainer.openClientSocket(JdkClientContainer.java:106) ~[na:na] 

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

logger.info(System.setProperty(ClientManager.WLS_MAX_THREADS, "1")); 
logger.info(System.getProperty(ClientManager.WLS_MAX_THREADS)); 

Я получаю ожидаемый результат без проблем с безопасностью.

Конечно, я уверен, что все банки полностью подписаны, все банки имеют флаг в файлах Manifest.MF, а у jnlp есть нужный тег <security><all-permissions /></security>.

Помимо этого я также попытался использовать реализацию websocket для причала, однако это дало мне точно такие же проблемы.

У кого-нибудь есть идея, почему код tyrus не может получить доступ к тому же системному свойству, что и основной код?

+0

Существуют системные свойства для установки трассировки отладки на контроллере доступа (забудьте, что они находятся вне руки). Установка глобального состояния в общей виртуальной машине - плохая идея (очевидно). Некоторые случаи запрещены, если процесс не развязан. (О, и подпись не обязательно означает, что вы полностью доверяете.) –

+0

Я просто попробовал это, и он (приложение JavaFX, использующее клиентские библиотеки веб-сокетов Tyrus под управлением Web Start) отлично справился со мной (см. [Github project] (https://github.com/jewelsea/javafx-websocket-test)). Я использовал плагин JavaFX maven для создания и (самостоятельного) подписывания приложения и требуемых банок со всеми разрешениями. – jewelsea

ответ

2

Хорошо, спасибо за помощь, я наконец нашел ответ. Подсказка @Tom Hawtin дала мне правильную подсказку, мне все равно нужно перевести звонок в webSocket.connectToClient() в AccessController.doPrivileged(), чтобы получить полные права в зависимом коде.

Однако я до сих пор не совсем понимаю, почему подписанный код с Permissions: all-permissions не заслуживает доверия, может быть, мне стоит ознакомиться с моделью безопасности WebStart.

Редактировать: Хорошо, после игры гораздо больше и поиска более странных ошибок. Я нашел настоящую проблему: когда я интегрировал WebSockets в приложение, я сильно использовал методы CompleableFuture.xxxAsync(). И по умолчанию они работают на общем ForkJoinPool, который, в свою очередь, запускается на специальных потоках (InnocuousForkJoinWorkerThread), если присутствует менеджер безопасности (как это очевидно в случае с использованием jnpl). И у них нет каких-либо разрешений, которые правильно вызвали все эти ошибки.

Таким образом, решение заключается в использовании специального Исполнителя для вызовов xxxAsync(xxx, executor).

+0

Я не понимаю этого ответа либо потому, что мое тестовое приложение работало, не обертывая вызовы внутри doPrivileged. Рад, что вы все-таки работали. – jewelsea

+0

Я думаю, что метод, который вы используете, - это '' ClientManager :: connectToServer (...) '] (https://tyrus.java.net/apidocs/1.9/org/glassfish/tyrus/client/ClientManager.html#connectToServer (javax.websocket.Endpoint,% 20javax.websocket.ClientEndpointConfig,% 20java.net.URI)) not 'connectToClient()' (который, я не могу найти ссылку в любом месте)? – jewelsea

+0

@jewelsea Конечно, вы правы, connectToServer() - это правильное имя метода – clemensm