当从unsigned Javascript调用时,如何获得已签名的Java Applet以执行特权操作?

时间:2009-06-17 12:25:54

标签: java javascript security applet

签名的Java Applet与客户端上运行的普通Java应用程序具有相同的安全许可。对于特定项目,我需要这些权限,并且我需要来执行JavaScript调用后的特权操作。

现在,问题在于,至少对于Ubuntu(目标浏览器和平台)中的Firefox 3,当通过未签名的JavaScript调用applet方法时,它会丢失其特殊权限。由于签署JavaScript不是一种选择,我需要一种解决此限制的方法。

实现此目的的一种方法是在applet启动时创建一个线程,并在主线程接收到JavaScript调用时调用该线程上的方法。我已经实现了这个想法的工作原型,但我发现它有点笨拙,因为它使用了太多的反射并且不像我想要的那样容易重复使用。

有没有一种共同的,标准的方式来做我想做的事情?而且,如果我的想法是正确的方法,你将如何以可重用的方式实现它?我想要实现的是一个框架,它允许这个“运行方法在特权线程”的东西用于各种对象。理想的,utopic解决方案将是:

// 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

2 个答案:

答案 0 :(得分:8)

使用java.security.AccessController类。

有一个doPrivilegedAction和doPrivilegedExceptionAction可以完全满足你的需要。

例如:

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

答案 1 :(得分:0)

值得补充的是:尽可能使您的run()方法尽可能小且独立。显然你可以让你签名的applet的init()方法调用一个特权run(),而这个特权{{1}}反过来会执行实际的applet,但这只是乞求被滥用,被误用或被彻底利用。

此外,签名小程序在被JavaScript调用时失去其特殊权限这一事实并非特定于特定浏览器或平台。这就是它,无论何时何地,它都是如此。