Ошибки безопасности при запуске с Nashorn при развертывании приложения Spring на сервере

У меня есть Spring Webapp, которое выдает некоторые запутанные ошибки при запуске, когда я развертываю его на своем производственном сервере (они не возникают, когда я запускаю его локально) - ошибки, похоже, ни на что не влияют, поэтому этот вопрос больше не подходит любопытство, чем настоящая потребность в помощи.

Вот трассировка стека:

20-Apr-2016 17:31:31.711 INFO [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.loadClass Security Violation, attempt to use Restricted Class: jdk.internal.dynalink.support.messages_en_US
 java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessClassInPackage.jdk.internal.dynalink.support")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:884)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.SecurityManager.checkPackageAccess(SecurityManager.java:1564)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1268)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
    at java.util.ResourceBundle$Control.newBundle(ResourceBundle.java:2640)
    at java.util.ResourceBundle.loadBundle(ResourceBundle.java:1501)
    at java.util.ResourceBundle.findBundle(ResourceBundle.java:1465)
    at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1361)
    at java.util.ResourceBundle.getBundle(ResourceBundle.java:1082)
    at java.util.logging.Logger.findResourceBundle(Logger.java:1879)
    at java.util.logging.Logger.setupResourceInfo(Logger.java:1940)
    at java.util.logging.Logger.<init>(Logger.java:380)
    at java.util.logging.LogManager.demandLogger(LogManager.java:554)
    at java.util.logging.Logger.demandLogger(Logger.java:455)
    at java.util.logging.Logger.getLogger(Logger.java:553)
    at jdk.internal.dynalink.support.Guards.<clinit>(Guards.java:101)
    at jdk.nashorn.internal.runtime.Undefined.<clinit>(Undefined.java:51)
    at jdk.nashorn.internal.runtime.JSType.<clinit>(JSType.java:263)
    at jdk.nashorn.internal.runtime.AccessorProperty.<clinit>(AccessorProperty.java:60)
    at jdk.nashorn.internal.objects.Global.$clinit$(Global.java)
    at jdk.nashorn.internal.objects.Global.<clinit>(Global.java:919)
    at jdk.nashorn.internal.runtime.Context.newGlobal(Context.java:1102)
    at jdk.nashorn.api.scripting.NashornScriptEngine$2.run(NashornScriptEngine.java:347)
    at jdk.nashorn.api.scripting.NashornScriptEngine$2.run(NashornScriptEngine.java:343)
    at java.security.AccessController.doPrivileged(Native Method)
    at jdk.nashorn.api.scripting.NashornScriptEngine.createNashornGlobal(NashornScriptEngine.java:343)
    at jdk.nashorn.api.scripting.NashornScriptEngine.<init>(NashornScriptEngine.java:143)
    at jdk.nashorn.api.scripting.NashornScriptEngineFactory.getScriptEngine(NashornScriptEngineFactory.java:148)
    at javax.script.ScriptEngineManager.getEngineByName(ScriptEngineManager.java:238)
    at com.my.applicationlib.security.ScriptSandbox.<init>(ScriptSandbox.java:60)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$4.run(AbstractAutowireCapableBeanFactory.java:1089)
    at java.security.AccessController.doPrivileged(Native Method)
    ...

И соответствующий код выглядит следующим образом:

@Service
public class ScriptSandbox {
    ScriptEngine _scriptEngine;
    AccessControlContext _accessControlContext;

    public ScriptSandbox() throws InstantiationException{
        ScriptEngineManager sem = new ScriptEngineManager();
        _scriptEngine = sem.getEngineByName("nashorn");//This error happens on this line.
        if (_scriptEngine==null){
            throw new InstantiationException("Could not load script engine: "+
                    "nashorn");
        }
        setPermissions(null);
   }
}

Мне не удалось найти много актуальной информации в Google, больше всего я видел, что она мне нужна в моей конфигурации безопасности Java. Мой выглядит так, поэтому я думаю, что у меня есть то, что мне нужно:

grant {permission java.security.AllPermission; permission java.lang.RuntimePermission;};

Есть предположения?

Изменить: этот вопрос был отмечен как дубликат этого вопроса. Я не думаю, что это по следующим причинам:

он работает нормально, когда я инициализирую nashorn позже в приложении, кажется, что он работает. Я получаю эту ошибку при определении bean только из того, что могу сказать. Не думайте, что это проблема с подписью, поскольку она возникает только при определении bean-компонента.

Кроме того, на этот вопрос нет принятых ответов и мало голосов. Есть ли какое-либо из этих решений для этой проблемы?


person S. Buda    schedule 20.04.2016    source источник
comment
Я добавил некоторые пояснения, которые, надеюсь, отличают этот вопрос от дубликата.   -  person S. Buda    schedule 21.04.2016


Ответы (1)


Как бы то ни было, я обошел это стороной, и мне это не супер. Поскольку я использовал это только в одной службе, я полностью удалил аннотацию службы и инициализировал ее вызовом в методе @PostConstruct. Я все еще хочу знать, почему это не работает на этапе создания bean-компонентов в Spring.

@Service
public class MyServiceThatUsesScriptSandbox(){
    private ScriptSandbox sandbox;
    @PostConstruct
    public void initSandbox(){
        sandbox = new ScriptSandbox();
    }
}
person S. Buda    schedule 22.04.2016