2016-09-01 32 views
1

我正在將基於小程序的應用程序遷移到Web Start應用程序中。JavaFX Web Start應用程序中的自定義SecureClassLoader和權限

在應用程序中,爲了從不同媒體獲取資源和類,需要自定義ClassLoader。它還使用頂部的JavaFX圖層。

將所有權限授予WebStart應用程序,清單已完成並且使用有效證書對jar進行簽名。事實上,如果我不從媒體中獲取這些類,並使用默認的ClassLoader加載它們,那麼一切正常。但是,如果使用了定製的ClassLoader,我們面臨的問題一樣:java.security.AccessControlException:致

訪問被拒絕 ( 「java.net.SocketPermission」 「www.mydomain.com:443」「連接,resolve「)

對於測試提議,自定義SecureClassLoader授予所有權限。這沒有幫助。

我也想更換安全管理器,但我不能:

java.lang.SecurityException異常:JVM共享,不允許設置安全 經理

即使我參數添加到該applet描述符的JNLP內:

PARAM NAME = 「separate_jvm」 值= 「真」

我無法替換經理。

任何人都可以指出我能做些什麼才能授予這些類的權限?無法在客戶端更改策略文件。

這裏我堆棧跟蹤添加到地步電話都來自:

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) 

感謝。

回答

0

最後檢測到問題。

系統類加載器被設置爲我們的自定義類加載器的父類加載器,而不是使用加載我們的類加載器類的類加載器。

因此,其他類加載器由我們的應用程序庫級聯,丟失在流中,並在權限解析方面產生衝突。