2009-06-17 11 views
6

Los applets de Java firmados tienen la misma autorización de seguridad que una aplicación Java normal que se ejecuta en el cliente. Para un proyecto particular, que necesito estos permisos, y yo necesito para realizar operaciones privilegiadas como resultado de una llamada de JavaScript.¿Cómo puedo obtener un Applet Java firmado para realizar operaciones privilegiadas cuando se me llama desde un Javascript sin firmar?

Ahora, el problema es que, al menos para Firefox 3 en Ubuntu (navegador de destino y plataforma), cuando se invoca un método de applet a través de JavaScript sin firmar, pierde sus permisos especiales. Como la firma de JavaScript no es una opción, necesito una forma de evitar esta restricción.

Una forma de lograr esto es crear un hilo cuando el applet se inicia, y llamar a métodos en ese hilo cada vez que el hilo principal recibe la llamadas JavaScript. Implementé un prototipo funcional de esa idea, pero lo encontré un poco torpe porque usa demasiada reflexión y no es tan fácil de reutilizar como hubiera deseado.

¿Hay una manera común, estándar de hacer lo que estoy tratando de hacer? Y, si mi idea es la correcta, ¿cómo implementarla de forma reutilizable? Lo que intento lograr es un marco que permita que esta cosa de "ejecutar-métodos-en-un-privilegio-hilo" se use para una variedad de objetos. La solución ideal, utópico sería algo así como:

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

Respuesta

7

utilizar la clase java.security.AccessController.

Hay una doPrivilegedAction y doPrivilegedExceptionAction que haga exactamente lo que necesita.

Por ejemplo:

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

Vale la pena añadir: hacer que su método run() privaction'd tan pequeño y autónomo posible. Obviamente, usted podría tener método del applet firmado init() llama a un privilegiado run() que a su vez hace que el applet real, pero eso es sólo piden a gritos ser objeto de abuso, mal uso accidental, o directamente explotados.

Además, el hecho de que firmó applets pierden sus permisos especiales cuando se le llama por JavaScript no es específico para un navegador o plataforma en particular. Así es como es, en todas partes, todo el tiempo.

Cuestiones relacionadas