Отказ от ответственности: старая версия вопроса была запутанной SecurityManager
и AccessController
. Но теперь я знаю, что совершил ошибку, и вопрос уточняется.
Стебель довольно прямо вперед; я ищу способ ограничить то, что сценарий может сделать в некотором ScriptEngine.
Я читал похожие вопросы, старые и новые. Кажется, есть решение для NashornScriptEngine
использования вызванного класса ClassFilter
. Но я ищу общий способ, независимо от их реализации обработчика сценариев. Некоторые предполагают, что JavaAccessController
-это путь. Так что я начал читать и играть сAccessController
, до сих пор у меня есть это:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
Permissions perms = new Permissions();
ProtectionDomain domain = new ProtectionDomain(new CodeSource( null, (Certificate[]) null ), perms);
AccessControlContext acc = new AccessControlContext(new ProtectionDomain[] { domain });
AccessController.doPrivileged(new PrivilegedAction() {
@Override
public Object run() {
try {
//I want the following line to throw a SecurityException
return engine.eval("var System = Java.type('java.lang.System'); print(System.getProperty('java.home'));");
}
catch (ScriptException e) {
e.printStackTrace();
}
return null;
}},
acc
);
//At the same time I want the following line to work
System.out.println(System.getProperty("java.home"));
И сценарий работает, как будто нет никакого AccessController участвует!
Итак, мой вопрос: есть ли AccessController
способ сделать это? И если это так, то как я должен это делать?
Таким образом, мне удалось решить проблему здесь самостоятельно. После прочтения немного больше, я обнаружил, что
AccessController
не имеет никакого эффекта, еслиSecurityManager
не активируется. И вот как вы его активируете:Добавление двух параметров виртуальной машины:
-Djava.security.manager
-Djava.security.policy=security.policy
Создайте
security.policy
файл в корневой папке проекта со следующим содержимым:grant {
permission java.security.AllPermission;
};
Это активирует
SecurityManager
для вашего проекта и предоставить ему все разрешения. Другими словами, он просто активируетсяSecurityManager
, но ваш код будет работать, как и раньше. Теперь вы можете управлять частями управления доступом приложения с помощью кода, приведенного выше.