2009-06-17 144 views
6

已簽名的Java Applets與客戶端上運行的普通Java應用程序具有相同的安全許可。對於特定的項目,我需要這些權限,而我需要需要來執行特權操作,作爲JavaScript調用的結果。如何從unsigned Javascript中調用已簽名的Java Applet執行特權操作?

現在,問題在於,至少對於Ubuntu(目標瀏覽器和平臺)中的Firefox 3,當通過未簽名的JavaScript調用applet方法時,它將失去其特殊權限。由於簽署JavaScript不是一種選擇,我需要一種方法來解決這個限制。

實現此目的的一種方法是在小程序啓動時創建線程,並在主線程接收到JavaScript調用時調用該線程上的方法。我已經實現了這個想法的工作原型,但是我發現它有點笨拙,因爲它使用了太多的反射,並且不像我想要的那樣容易重用。

有沒有一個共同的,標準的做我想做的事情?而且,如果我的想法是正確的路要走,你會如何以可重用的方式實施它?我想要實現的是一個框架,它允許將「運行方法在一個特權線程」的東西用於各種對象。理想的烏托邦解決方案應該是這樣的:

// when the applet starts-up 
PrivilegedExecuter priv = new PrivilegedExecuter(myObject); //or MyClass.class 
// ... 
// inside a JavaScript-called method (myObject has myMethod) 
priv.myMethod(); // myMethod is run synchronously in a privileged thread 

回答

7

使用java.security.AccessController類。

有一個doPrivilegedAction和doPrivilegedExceptionAction完全符合你的需求。

例如:

 
AccessController.doPrivileged(new PrivilegedAction() { 
      public Object run() { 
       .. do something that only works with signed applets .. 
      } 
     }); 
0

值得補充說:讓你的privaction'd run()方法,小和自足越好。很明顯,你可以讓你的簽名applet的init()方法調用一個特權run(),它反過來做實際的applet,但這只是乞求被濫用,誤用或被徹底利用。

此外,簽名小程序在被JavaScript調用時失去其特殊權限的事實並非特定於特定瀏覽器或平臺。這就是這樣,無處不在。