gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:59:29 25 4
gpt4 key购买 nike

我对 Java Web Start 有一个严重的问题,我无法解决这个问题。情况如下:我有一个用 Java8 编写的 JavaFX 应用程序,我想使用 Java WebStart 对其进行部署。直到最近我还使用 HTTP 与服务器通信,一切正常。我可以使用浏览器中嵌入的 Web Start 或作为独立应用程序部署该应用程序。

不过,我现在已将通信更改为使用 WebSockets。为此,我目前正在使用 tyrus 实现。现在问题来了:因为我添加了 tyrus 库,所以当 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 都有 Permissions: all-permissions在他们的 Manifest.MF 文件中标记,并且 jnlp 确实具有所需的 <security><all-permissions /></security>标签。

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

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

最佳答案

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

但是我仍然不完全理解为什么使用 Permissions: all-permissions 签名的代码不受信任,也许我应该阅读 WebStart 安全模型。

编辑:好吧,在尝试了很多次并发现了更多奇怪的错误之后,我发现了真正的问题:当我将 WebSockets 集成到应用程序中时,我大量使用了 CompleableFuture.xxxAsync() 方法。默认情况下,它们在公共(public) ForkJoinPool 上运行,如果存在安全管理器(使用 jnpl 的情况很明显),它又在特殊线程 (InnocuousForkJoinWorkerThread) 上运行。而且那些没有任何权限,正确触发了所有这些错误。

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

关于java - 如何授予jnlp文件中的依赖库所有权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27231276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com