- "Создать новую тему (будет ли эта работа вообще работать?)"
Не работает по причинам, указанным ниже
- Пусть апплет всегда готов к запуску потока, запускаемого через нить JavaScript-источника
Конечно, будет работать, но это более болезненно, чем вызов doPrivileged
, но семантически имеет тот же эффект.
- Использовать AccessController.doPrivileged
Да, это будет работать.
Каждая проверка контроля доступа проверяет набор всех кадров стека в стеке текущего потока (включая кадр стека, приводящий к созданию экземпляра текущего потока, рекурсивно). Если есть кадр doPrivileged
, кадры, ведущие к этому кадру, не включаются в набор (но фактический doPrivileged
кадр включает в комплекте).
Если проверяемая привилегия присутствует не в каждом отдельном кадре в этом наборе, проверка не пройдена.
Другими словами, текущие привилегии потока являются пересечением привилегий в этом наборе.
Так, например, если в привилегированном коде doPrivileged
есть какой-то непривилегированный код, который пытается открыть файл, проверка не будет выполнена. Аналогично, если непривилегированный код doPrivileged
является привилегированным кодом, открывающим файл, проверка не будет выполнена. Но если непривилегированный код вызывает привилегированный код, а привилегированный код, в свою очередь, вызывает doPrivileged
, чтобы открыть файл, проверка пройдет успешно.
Теоретически, вы должны иметь возможность предоставлять только вашей кодовой базе Java необходимые ей привилегии (возможно, доступ к некоторому изолированному каталогу), а затем предоставлять такие же привилегии JavaScript код, который будет использовать этот привилегированный код, но я сомневаюсь, что любой браузер имеет такие функции. Я удивлен, что JavaScript работает даже в другом домене защиты, чем Java.
Я никогда не делал JavaScript <-> взаимодействие с Java, но, кажется, неважно, что вам нужно, чтобы методы, вызываемые JavaScript, использовали блоки doPrivileged
во всем своем теле.
РЕДАКТИРОВАТЬ: Как сказал Сами, будьте осторожны при вызове doPrivileged
блоков в привилегированном коде (и прочитайте его ответ).