JavaFX Web Start应用程序中的自定义SecureClassLoader和权限

JavaFX Web Start应用程序中的自定义SecureClassLoader和权限,java,security,classloader,java-web-start,Java,Security,Classloader,Java Web Start,我正在将基于小程序的应用程序迁移到Web Start应用程序 在应用程序中,需要一个自定义类加载器,以便从不同的媒体获取资源和类。它还在顶部使用JavaFX层 所有权限都授予WebStart应用程序,清单已完成,jar已使用有效证书签名。事实上,如果我不从媒体中获取类并使用默认的类加载器加载它们,那么一切都会正常工作。但是如果我使用自定义类加载器,我们将面临以下问题: 原因:java.security.AccessControlException:拒绝访问 (“java.net.SocketPe

我正在将基于小程序的应用程序迁移到Web Start应用程序

在应用程序中,需要一个自定义类加载器,以便从不同的媒体获取资源和类。它还在顶部使用JavaFX层

所有权限都授予WebStart应用程序,清单已完成,jar已使用有效证书签名。事实上,如果我不从媒体中获取类并使用默认的类加载器加载它们,那么一切都会正常工作。但是如果我使用自定义类加载器,我们将面临以下问题:

原因:java.security.AccessControlException:拒绝访问 (“java.net.SocketPermission”“www.mydomain.com:443”“连接,解析”)

对于测试方案,自定义SecureClassLoader正在授予所有权限。这没有帮助

我还试图更换安全经理,但我不能:

java.lang.SecurityException:JVM共享,不允许设置安全性 经理

即使我将参数添加到jnlp内的小程序描述符中:

PARAM name=“separate_jvm”value=“true”

我不能代替经理

有人能指出我该怎么做才能授予这些类权限吗?无法更改客户端上的策略文件

在这里,我将stacktrace添加到调用来自的位置:

java.security.AccessControlException: access denied ("java.net.SocketPermission" "www.mydomian.com" "resolve")
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at sun.plugin2.applet.SecurityManagerHelper.checkConnectHelper(Unknown Source)
at sun.plugin2.applet.FXAppletSecurityManager.checkConnect(Unknown Source)
at java.net.InetAddress.getAllByName0(Unknown Source)
at java.net.InetAddress.getAllByName(Unknown Source)
at java.net.InetAddress.getAllByName(Unknown Source)
at java.net.InetAddress.getByName(Unknown Source)
at com.sun.deploy.net.CrossDomainXML.addAccess(Unknown Source)
at com.sun.deploy.net.CrossDomainXML.allowNoAccess(Unknown Source)
at com.sun.deploy.net.CrossDomainXML.check(Unknown Source)
at sun.plugin2.applet.SecurityManagerHelper.checkConnectHelper(Unknown Source)
at sun.plugin2.applet.FXAppletSecurityManager.checkConnect(Unknown Source)
at java.net.InetAddress.getAllByName0(Unknown Source)
at java.net.InetAddress.getAllByName(Unknown Source)
at java.net.InetAddress.getAllByName(Unknown Source)
at java.net.InetAddress.getByName(Unknown Source)
at java.net.URLStreamHandler.getHostAddress(Unknown Source)
at java.net.URLStreamHandler.hashCode(Unknown Source)
at java.net.URL.hashCode(Unknown Source)
at java.util.HashMap.hash(Unknown Source)
at java.util.HashMap.get(Unknown Source)
at com.sun.deploy.security.CPCallbackHandler.getDefaultCodeSource(Unknown Source)
at com.sun.deploy.security.CPCallbackHandler.access$1400(Unknown Source)
at com.sun.deploy.security.CPCallbackHandler$ChildElement.<init>(Unknown Source)
at com.sun.deploy.security.CPCallbackHandler$ChildCallback.openClassPathElement(Unknown Source)
at com.sun.deploy.security.CPCallbackHandler$ChildCallback.openClassPathElement(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.getCodebaseLookup(Unknown Source)
at sun.plugin2.applet.Plugin2ClassLoader.getResourceAsResource(Unknown Source)
at com.sun.deploy.security.DeployURLClassLoader.getResourceAsStream(Unknown Source)
at java.lang.Class.getResourceAsStream(Unknown Source)
at mypackage.Util.readResource(Util.java:42)
at mypackage.CustomClassLoader.encryptedLookup(CustomClassLoader.java:101)
at mypackage.ClassLoader.findClass(CustomClassLoader.java:78)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at customUtil.ParametersGetter.getRole(ParametersGetter.java:80)
at com.application.ModuleConfig.main(ModConfig.java:448)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at mypackage.CustomClassLoader.launch(CustomClassLoader.java:126)
at mypackage.Browser$1.call(Browser.java:54)
at mypackage.Browser$1.call(Browser.java:45)
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
java.security.AccessControlException:拒绝访问(“java.net.SocketPermission”“www.mydomian.com”“解析”)
位于java.security.AccessControlContext.checkPermission(未知源)
位于java.security.AccessController.checkPermission(未知源)
位于java.lang.SecurityManager.checkPermission(未知源)
位于java.lang.SecurityManager.checkConnect(未知源)
位于sun.plugin2.applet.SecurityManager.checkConnectHelper(未知源)
位于sun.plugin2.applet.FXAppletSecurityManager.checkConnect(未知源)
位于java.net.InetAddress.getAllByName0(未知源)
位于java.net.InetAddress.getAllByName(未知源)
位于java.net.InetAddress.getAllByName(未知源)
位于java.net.InetAddress.getByName(未知源)
位于com.sun.deploy.net.CrossDomainXML.addAccess(未知源)
位于com.sun.deploy.net.CrossDomainXML.allowNoAccess(未知源)
位于com.sun.deploy.net.CrossDomainXML.check(未知源)
位于sun.plugin2.applet.SecurityManager.checkConnectHelper(未知源)
位于sun.plugin2.applet.FXAppletSecurityManager.checkConnect(未知源)
位于java.net.InetAddress.getAllByName0(未知源)
位于java.net.InetAddress.getAllByName(未知源)
位于java.net.InetAddress.getAllByName(未知源)
位于java.net.InetAddress.getByName(未知源)
位于java.net.URLStreamHandler.getHostAddress(未知源)
位于java.net.URLStreamHandler.hashCode(未知源代码)
位于java.net.URL.hashCode(未知源代码)
位于java.util.HashMap.hash(未知源)
位于java.util.HashMap.get(未知源)
位于com.sun.deploy.security.CPCallbackHandler.getDefaultCodeSource(未知源)
位于com.sun.deploy.security.CPCallbackHandler.access$1400(未知来源)
位于com.sun.deploy.security.CPCallbackHandler$ChildElement。(未知源)
位于com.sun.deploy.security.CPCallbackHandler$ChildCallback.openClassPathElement(未知源)
位于com.sun.deploy.security.CPCallbackHandler$ChildCallback.openClassPathElement(未知源)
位于sun.plugin2.applet.Plugin2ClassLoader.getCodebaseLookup(未知源)
位于sun.plugin2.applet.Plugin2ClassLoader.getResourceAsResource(未知源)
位于com.sun.deploy.security.DeployURLClassLoader.getResourceAsStream(未知源)
位于java.lang.Class.getResourceAsStream(未知源)
在mypackage.Util.readResource(Util.java:42)
在mypackage.CustomClassLoader.encryptedLookup(CustomClassLoader.java:101)中
在mypackage.ClassLoader.findClass(CustomClassLoader.java:78)
位于java.lang.ClassLoader.loadClass(未知源)
位于java.lang.ClassLoader.loadClass(未知源)
在customUtil.ParametersGetter.getRole(ParametersGetter.java:80)
位于com.application.ModuleConfig.main(ModConfig.java:448)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
在mypackage.CustomClassLoader.launch(CustomClassLoader.java:126)
在mypackage.Browser$1.call(Browser.java:54)
在mypackage.Browser$1.call(Browser.java:45)
位于javafx.concurrent.Task$TaskCallable.call(Task.java:1423)
位于java.util.concurrent.FutureTask.run(未知源)
位于java.lang.Thread.run(未知源)

谢谢。

终于发现了问题

系统类加载器被设置为自定义类加载器的父类加载器,而不是使用加载类加载器类的类加载器


结果,其他类加载器被我们的应用程序库级联,在流中丢失,这在权限解析上产生了冲突

终于发现了问题

系统类加载器被设置为自定义类加载器的父类加载器,而不是使用加载类加载器类的类加载器

结果,其他类加载器被我们的应用程序库级联,在流中丢失,这在权限解析上产生了冲突