Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何授予jnlp文件中的依赖库所有权限?_Java_Security_Permissions_Java Web Start_Jnlp - Fatal编程技术网

Java 如何授予jnlp文件中的依赖库所有权限?

Java 如何授予jnlp文件中的依赖库所有权限?,java,security,permissions,java-web-start,jnlp,Java,Security,Permissions,Java Web Start,Jnlp,我在JavaWebStart上遇到了一个严重的问题,我无法解决这个问题。情况如下:我有一个JavaFX应用程序,编写为Java8,我想使用JavaWebStart部署它。直到最近,我还使用HTTP与服务器通信,一切都很好。我可以使用嵌入在浏览器中的Web Start或作为独立应用程序部署该应用程序 不过,我现在已将通信更改为使用WebSocket。为此,我目前正在使用tyrus实现。现在问题来了:因为我添加了tyrus lib,所以当tyrus尝试访问系统属性时,我总是会得到AccessCont

我在JavaWebStart上遇到了一个严重的问题,我无法解决这个问题。情况如下:我有一个JavaFX应用程序,编写为Java8,我想使用JavaWebStart部署它。直到最近,我还使用HTTP与服务器通信,一切都很好。我可以使用嵌入在浏览器中的Web Start或作为独立应用程序部署该应用程序

不过,我现在已将通信更改为使用WebSocket。为此,我目前正在使用tyrus实现。现在问题来了:因为我添加了tyrus lib,所以当tyrus尝试访问系统属性时,我总是会得到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));
我在没有安全问题的情况下得到了预期的结果

当然,我已经确保所有JAR都已完全签名,所有JAR都具有
权限:Manifest.MF文件中的所有权限
标志,jnlp确实具有所需的
标记

除此之外,我还尝试使用jetty websocket实现,但是这给了我完全相同的问题


有人知道为什么tyrus代码不能访问与主代码相同的系统属性吗?

好的,谢谢你的帮助,我终于找到了答案。@Tom Hawtin的提示给了我正确的线索,我仍然需要将对
webSocket.connectToClient()
的调用包装在
AccessController.doPrivileged()
中,以获得依赖代码的完整权限

但是,我仍然不完全理解为什么使用
权限签名的代码:所有权限都不受信任,也许我应该阅读WebStart安全模型

编辑: 好的,在玩了更多的游戏并发现了更多奇怪的bug之后,我发现了真正的问题:当我将WebSocket集成到应用程序中时,我大量使用了
CompletableFuture.xxxAsync()
方法。默认情况下,它们运行在公共ForkJoinPool上,如果存在安全管理器(使用jnpl的情况很明显),那么公共ForkJoinPool反过来运行在特殊线程(
无害的ForkJoinWorkerThread
)上。这些人没有任何权限,这正确地触发了所有这些错误


因此,解决方案是为
xxxAsync(xxx,Executor)
调用使用自定义执行器。

有一些系统属性可以在访问控制器上设置调试跟踪(忘记它们是什么)。在共享VM中设置全局状态显然是个坏主意。有些情况是禁止的,除非进程是非共享的。(哦,签名并不一定意味着完全信任。)我只是尝试了一下,它(一个使用在WebStart下运行的TyrusWebSocket客户端库的JavaFX应用程序)对我来说运行良好(请参阅)。我使用JavaFX maven插件构建和(自)签名应用程序,并要求JAR具有所有权限。我也不理解这个答案,因为我的测试应用程序在doPrivileged中没有包装调用。很高兴你能让它工作。我认为你使用的方法不是
connectToClient()
(我似乎在任何地方都找不到引用)?@jewelsea当然你是对的,connectToServer()是正确的方法name@jewelseapost1:您在测试应用程序中使用了什么JDK?我正在使用idk 8_u25,刚刚意识到Oracle可能再次提高了安全性,但没有告诉任何人他们改变了什么……我使用的是Java 8u20(在OS X上),但我升级到Java 8u25是为了检查是否有任何改变,但是在Java 8u25升级后,应用程序对我来说仍然运行良好。如果你想在你的系统上尝试,你可以签出我在之前对你的问题的评论中链接的项目。