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

标签 java security permissions java-web-start jnlp

我在使用 Java Web Start 时遇到了一个严重的问题,我无法理解。情况如下:我有一个 JavaFX 应用程序,编写为 Java8,我想使用 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 安全模型。

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

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

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

相关文章:

java - TextToSpeech SynthesizeToFile 何时完成?

security - 将 session ID 作为 url 参数传递的危害

java - 如何定义unix权限常量(READ、WRITE、EXECUTE)

node.js - 如何使用node.js更改同一文件夹中的所有文件和文件夹权限

c# - 程序在哪里保存他们的 secret 许可证?

mysql - 使用通配符设置用户 mysql 的权限?

java - eclipse Java 的自动文档工具

java - 如何在动态sql搜索中使用LIKE?

java - Selenium(OSX 和 Linux)抛出错误 org.openqa.selenium.SessionNotCreatedException : session not created: No matching capabilities found

ruby-on-rails - 如何确保向 Rails 发送此发布请求?