Как получить подписанный Java-апплет для выполнения привилегированных операций при вызове из неподписанного Javascript? - PullRequest
7 голосов
/ 17 июня 2009

Подписанные Java-апплеты имеют тот же уровень безопасности, что и обычное Java-приложение, работающее на клиенте. Для конкретного проекта мне нужны эти разрешения, а мне нужно для выполнения привилегированных операций в результате вызова JavaScript.

Теперь проблема в том, что, по крайней мере для Firefox 3 в Ubuntu (целевой браузер и платформа), когда метод апплета вызывается через неподписанный JavaScript, он теряет свои специальные разрешения. Поскольку подписание 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

Ответы [ 2 ]

8 голосов
/ 17 июня 2009

Используйте класс java.security.AccessController.

Существует действие doPrivilegedAction и doPrivilegedExceptionAction, которое делает именно то, что вам нужно.

Например:

AccessController.doPrivileged(new PrivilegedAction() {
            public Object run() {
               .. do something that only works with signed applets ..
            }
        });
0 голосов
/ 17 декабря 2012

Стоит добавить: сделайте свой метод приватизации run() как можно более мелким и автономным.Очевидно, вы могли бы просто вызвать метод init () подписанного апплета для вызова привилегированного run(), который, в свою очередь, выполняет фактический апплет, но это просто умение злоупотреблять, случайно использовать или использовать напрямую.Тот факт, что подписанные апплеты теряют свои специальные разрешения при вызове JavaScript, не является специфическим для конкретного браузера или платформы.Вот так, везде, всегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...