Почему AccessController не блокирует непривилегированный доступ

Отказ от ответственности: старая версия вопроса была запутанной 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способ сделать это? И если это так, то как я должен это делать?

1 ответ

  1. Таким образом, мне удалось решить проблему здесь самостоятельно. После прочтения немного больше, я обнаружил, что AccessControllerне имеет никакого эффекта, если SecurityManagerне активируется. И вот как вы его активируете:

    1. Добавление двух параметров виртуальной машины: -Djava.security.manager
      -Djava.security.policy=security.policy

    2. Создайте security.policyфайл в корневой папке проекта со следующим содержимым:
      grant {
      permission java.security.AllPermission;
      };

    Это активирует SecurityManagerдля вашего проекта и предоставить ему все разрешения. Другими словами, он просто активируетсяSecurityManager, но ваш код будет работать, как и раньше. Теперь вы можете управлять частями управления доступом приложения с помощью кода, приведенного выше.