Tut AccessController.doPrivileged geben, die JavaScript-threads, die Berechtigungen für das signierte Applet?

Ich freue mich auf ein signiertes Applet, das stark den Aufruf aus JavaScript. Natürlich, die threads, stammen von JavaScript sind stärker Sandbox als jeder thread gestartet, direkt aus Java. Zum Beispiel, wenn ein JavaScript-thread-Aufrufe in das Applet und meldet etwas, das bewirkt, dass die log-Datei zu Rollen, wird eine Sicherheitsausnahme ausgelöst. Ein thread gestartet, der direkt in das Applet nicht die Erfahrung diese Sicherheit Ausnahme. Hier die Lösung mit log4j ist die Verwendung der asynchronen appender.

Aber mit anderen Sicherheits-Ausnahmen (zum Beispiel die Nutzung von Apache Axis in der signierten Applet aber in einem JavaScript-thread) gibt es keinen offensichtlichen Weg, um einige asynchrone thread. Sagen wir, ich habe den folgenden code, wenn der Aufruf von einem Java-thread funktionieren wird, und wenn der Aufruf über JavaScript Fehler mit einer SecurityException:

public void someMethodCalledFromJavaScript() {
  //Stuff that would throw a SecurityException
}

Ich sehe drei folgenden Optionen, Sie können aber nicht alle gültig sein. Für die Zwecke dieser Diskussion, ignorieren, ob oder nicht die Ausführung synchron oder asynchron, wie das ist, einfach verwaltet werden. Ich bin eine schwierige Zeit das Verständnis der details der security-Modell. Hier sind meine drei mögliche Entscheidungen:

  • Einen neuen Thread starten (wird dieses sogar arbeiten?):

    public void someMethodCalledFromJavaScript() {
      new Thread(new Runnable() {
        public void run() {
          //Stuff that would throw a SecurityException
        }
      }).start();
    }
  • Haben das Applet einen thread bereit zu gehen, zu allen Zeiten, ausgelöst über die JavaScript-Ursprungs-thread (stark vereinfachte code hier):

    private volatile boolean doit = false;
    
    //This code is running in a Thread, started @ Applet init time
    public void alwaysWaiting() {
      while (true) {
        if (doit) {
          doit = false;
          //Stuff that would throw a SecurityException
        }
      }
    }
    
    public void someMethodCalledFromJavaScript() {
      doit = true;
    }
  • Verwenden AccessController.doPrivileged:

    public void someMethodCalledFromJavaScript() {
      AccessController.doPrivileged(new PrivilegedAction() {
        public Object run() {
          //Stuff that would throw a SecurityException
          return null;
        }
      });
    }

Nach dem, was ich gelesen AccessController.doPrivileged führen Sie mit dem Schnittpunkt der aktuellen Sicherheits-privs und die privs der security domain des Codes, den Sie hier aufrufen. Das ergibt keinen Sinn für mich, als wenn Sie mit der Kreuzung eine low und eine high-security Domäne, müssen Sie nur die low-security-domain. Also, klar ich bin etwas nicht zu verstehen.

Den spezifischen SecurityException ich sehe, ist dieses hier:

java.security.AccessControlException: access denied (java.lang.RuntimePermission accessDeclaredMembers)

aber natürlich bin ich neugierig auf den Allgemeinen Fall im Kontext der JavaScript-Aufruf in ein signiertes Applet, und wie kann ich ermöglichen, eine JavaScript-Ursprung-thread für die Ausführung mit der priv ist, der das signierte Applet, als wäre es ein thread, der stammt aus dem rein-Applet.

Welche Auswahl oben wird auch funktionieren, und die sind besser als andere und warum.

  • Jeder access control check prüft die Schnittmenge aller stack-frames (einschließlich des stack-Rahmens im Vorfeld der Instanziierung des aktuellen Threads, rekursiv). Wenn die privilegierten geprüft wird, ist nicht in jedem einzelnen frame, die Kreuzung, es schlägt fehl. Wenn es eine doPrivileged frame, alle frames im Vorfeld, dass der Rahmen ignoriert. So zum Beispiel, wenn Sie doPrivileged einige unprivilegierte code, der versucht, eine Datei zu öffnen, ist der check fehl. Ebenso, wenn nicht-privilegierten code doPrivileges Vertrauenswürdige code, der eine Datei öffnet, wird die überprüfung nicht erfolgreich ausgeführt werden.
  • Aber wenn Sie nicht vertrauenswürdigen code aufgerufen vertrauenswürdigen code und die vertrauenswürdigen code wiederum ruft doPrivilege um eine Datei zu öffnen, ist der check erfolgreich sein wird.
  • Warum schreiben Sie denn nicht, dass so eine Antwort?
InformationsquelleAutor Eddie | 2010-09-03
Schreibe einen Kommentar