Как предоставить зависимым lib в файле jnlp все разрешения?


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

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

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));

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

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

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

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

1 ответ:

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

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

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

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