2011-09-16 78 views
3

我有一個簽名的applet。爲了實現一些插件體系結構,我下載並存儲了一個具有特定類的JAR文件。已簽名的applet使用帶有安全問題的URLClassLoader加載帶簽名的jar文件

然後我用URLCLassLoader加載這些類。所以,現在我嘗試從加載的類調用某種方法,並且存在安全問題。

當加載類爲URLClassLoaded時,似乎無法通過SecurityManager檢查「sign-token」。任何人都知道如何解決這個問題?

非常感謝!

正在裝入。

URLClassLoader loader = new URLClassLoader(new URL[] {libraryArchive.toURI().toURL()}, Compress.class.getClassLoader()); 

調用。

... 
org.palettelabs.comm.desktopcapture.pim.Library lib = libraryClass.newInstance(); 
       final Compress compressingLibrary = (Compress) lib; 
       File file = AccessController.doPrivileged(new PrivilegedExceptionAction<File>() { 

        @Override 
        public File run() { 
         try { 
          File file = compressingLibrary.compress(filesList); 
          return file; 
         } catch (Exception e) { 
          Logger.error("applet: compress: invocation external library error", e); 
          return null; 
         } 
        } 

       }); 

例外。

2011-09-16 16:00:08,550 [SwingWorker-pool-1-thread-4] ERROR - applet: compress: invocation external library error 
java.security.AccessControlException: access denied (java.io.FilePermission /tmp/dca-palettelabs-storage/test/compress/linux32ffmpeg.jar-extractedFiles/org/palettelabs/ 
comm/desktopcapture/libs/compress/linux32 read) 
     at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374) 
     at java.security.AccessController.checkPermission(AccessController.java:546) 
     at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
     at java.lang.SecurityManager.checkRead(SecurityManager.java:871) 
     at java.io.File.exists(File.java:731) 
     at java.io.File.mkdirs(File.java:1181) 
     at org.palettelabs.comm.desktopcapture.pim.Library.extract(Library.java:31) 
     at org.palettelabs.comm.desktopcapture.libs.compress.linux32.Linux32.compress(Linux32.java:17) 
     at org.palettelabs.comm.desktopcapture.ui.UploadingWorker$1.run(UploadingWorker.java:77) 
     at org.palettelabs.comm.desktopcapture.ui.UploadingWorker$1.run(UploadingWorker.java:1) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at org.palettelabs.comm.desktopcapture.ui.UploadingWorker.compress(UploadingWorker.java:72) 
     at org.palettelabs.comm.desktopcapture.ui.UploadingWorker.doInBackground(UploadingWorker.java:57) 
     at org.palettelabs.comm.desktopcapture.ui.UploadingWorker.doInBackground(UploadingWorker.java:1) 
     at javax.swing.SwingWorker$1.call(SwingWorker.java:277) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
     at javax.swing.SwingWorker.run(SwingWorker.java:316) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 
+0

感謝您的反饋意見。 Applet在eclipse下從applet-launcher運行時沒有安全管理器就能正常工作。 –

+0

謝謝!但請解釋一下如何實施?瀏覽器使用調用JVM運行applet的特殊插件。我如何將默認的SecurityManager更改爲我的? –

+0

非常感謝!工作正常。我擴展了SecurityManager類,併爲我的類的驗證聲明瞭適當的規則。請張貼您的答案作爲我的問題的答案,我想將其標記爲最佳解決方案。 –

回答

1

安裝自定義安全管理器,允許來自正確的代碼庫(包,任何..)的代碼執行該操作。請致電System.setSecurityManager(myManager)。 (正如你設法計算的)myManagerSecurityManager的延伸。

它需要一個可信的小程序來設置安全管理器。

+0

在** applet **中設置'SecurityManager'? –

+0

@Tom我不明白你的問題。 –

+0

因此,如果您在小應用程序中設置安全管理器,它會影響同一進程中的所有應用程序。你不想這樣做。 (另外,你不希望兩個不同的applet這樣做。) –

1

使用適當的java.security.SecureClassLoader的子類來爲加載的類指定合適的ProtectionDomain。當然,要確保這些類將被某些機制所信任(例如,用您信任的證書籤署以用於此目的)。