Как предоставить зависимым 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 ответ:
Хорошо, спасибо за помощь, я наконец нашел ответ. Подсказка @Tom Hawtin дала мне правильный ключ, мне все еще нужно обернуть вызов
webSocket.connectToClient()
вAccessController.doPrivileged()
, чтобы получить полные права в зависимом коде.Однако я все еще не до конца понимаю, почему подписанный код с
Permissions: all-permissions
не является надежным, возможно, мне следует прочитать о модели безопасности WebStart.Править: Хорошо, после того, как я поиграл вокруг гораздо больше и нашел больше странных ошибок, я обнаружил настоящую проблему: когда я интегрировал WebSockets в применение я широко использовал методы
Таким образом, решение заключается в использовании пользовательского исполнителя для вызововCompleableFuture.xxxAsync()
. И по умолчанию они работают на общем ForkJoinPool, который, в свою очередь, работает на специальных потоках (InnocuousForkJoinWorkerThread
), Если присутствует менеджер безопасности (как это очевидно в случае использования jnpl). И у них нет никаких разрешений вообще, что правильно вызвало все эти ошибки.xxxAsync(xxx, executor)
.