Google App Engine — проблема безопасности Spring (java.security.AccessControlException)

В настоящее время я получаю исключение AccessControlException ниже при развертывании в механизме приложения (я не вижу его, когда запускаю в своей локальной среде). Я использую GAE 1.3.1, Spring 3.0.1 и Spring Security 3.0.2. Любые идеи, как обойти эту проблему? Похоже, что Spring Security пытается получить загрузчик системного класса из-за проблемы, но я не уверен, как это обойти.

Nested in org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.filterChainProxy': Initialization of bean failed; nested exception is java.security.AccessControlException: access denied (java.lang.RuntimePermission getClassLoader):
java.security.AccessControlException: access denied (java.lang.RuntimePermission getClassLoader)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:355)
    at java.security.AccessController.checkPermission(AccessController.java:567)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at com.google.apphosting.runtime.security.CustomSecurityManager.checkPermission(CustomSecurityManager.java:45)
    at java.lang.ClassLoader.getSystemClassLoader(Unknown Source)
    at org.springframework.beans.BeanUtils.findEditorByConvention(BeanUtils.java:392)
    at org.springframework.beans.TypeConverterDelegate.findDefaultEditor(TypeConverterDelegate.java:360)
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:213)
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:104)
    at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:419)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:657)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:191)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:984)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:888)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:270)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:125)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedMap(BeanDefinitionValueResolver.java:382)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:161)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1308)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:562)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:871)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:272)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:196)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
    at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:530)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:135)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:500)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:40)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:191)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:168)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:123)
    at com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:235)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5485)
    at com.google.apphosting.base.RuntimePb$EvaluationRuntime$6.handleBlockingRequest(RuntimePb.java:5483)
    at com.google.net.rpc.impl.BlockingApplicationHandler.handleRequest(BlockingApplicationHandler.java:24)
    at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:363)
    at com.google.net.rpc.impl.Server$2.run(Server.java:837)
    at com.google.tracing.LocalTraceSpanRunnable.run(LocalTraceSpanRunnable.java:56)
    at com.google.tracing.LocalTraceSpanBuilder.internalContinueSpan(LocalTraceSpanBuilder.java:536)
    at com.google.net.rpc.impl.Server.startRpc(Server.java:792)
    at com.google.net.rpc.impl.Server.processRequest(Server.java:367)
    at com.google.net.rpc.impl.ServerConnection.messageReceived(ServerConnection.java:448)
    at com.google.net.rpc.impl.RpcConnection.parseMessages(RpcConnection.java:319)
    at com.google.net.rpc.impl.RpcConnection.dataReceived(RpcConnection.java:290)
    at com.google.net.async.Connection.handleReadEvent(Connection.java:474)
    at com.google.net.async.EventDispatcher.processNetworkEvents(EventDispatcher.java:774)
    at com.google.net.async.EventDispatcher.internalLoop(EventDispatcher.java:205)
    at com.google.net.async.EventDispatcher.loop(EventDispatcher.java:101)
    at com.google.net.rpc.RpcService.runUntilServerShutdown(RpcService.java:251)
    at com.google.apphosting.runtime.JavaRuntime$RpcRunnable.run(JavaRuntime.java:394)
    at java.lang.Thread.run(Unknown Source)

person Taylor Leese    schedule 25.02.2010    source источник
comment
Это может помочь: answercow.com/2010/ 02/spring-forms-on-google-app-engine.html   -  person axtavt    schedule 25.02.2010
comment
Та же конфигурация и та же проблема здесь. Он работает с Spring Security 3.0.0 M3, но я хотел бы использовать последнюю доступную версию.   -  person Guido    schedule 04.03.2010
comment
Интересно, присмотрюсь к 3.0.0 М3.   -  person Taylor Leese    schedule 05.03.2010
comment
Я открыл ошибку в Spring Security. Пожалуйста, проголосуйте за него, если вы столкнулись с этой проблемой. jira.springframework.org/browse/SEC-1434   -  person Taylor Leese    schedule 09.03.2010


Ответы (2)


У меня была точно такая же проблема. Это не имеет отношения к Spring Security. Причиной этого является использование тегов формы Spring в движке приложения. См. http://www.answercow.com/2010/02/spring-forms-on-google-app-engine.html, чтобы узнать больше и узнать, как это исправить. Я следовал этим указаниям, и теперь все работает нормально.

person Kyle    schedule 25.02.2010
comment
Однако я не использую теги форм Spring ни в одном из своих JSP. - person Taylor Leese; 25.02.2010
comment
Ааа, не заглянул достаточно глубоко в трассировку стека, чтобы заметить разницу. Тем не менее, основной причиной является вызов BeanUtils.findEditorByConvention. Если вы зайдете в исходный код Spring и закомментируете этот метод и просто вернете из него null, все должно быть в порядке. Прочитайте ссылку, которую я предоставил, чтобы объяснить, почему это работает. - person Kyle; 25.02.2010
comment
Вероятно, нам следует открыть тикет с Spring по этому поводу, если его еще нет. Нет необходимости изменять источник. Вы смотрели, есть ли билет, открытый с Spring по этой проблеме? - person Taylor Leese; 25.02.2010
comment
Я не смотрел, но согласен, Spring, вероятно, должен просто поймать исключение безопасности в методе и просто вернуть null, если было исключение. - person Kyle; 26.02.2010
comment
+1 На самом деле это работает в Spring Security 3.0.0 M3 (последняя версия, которую я успешно пробовал) - person Guido; 04.03.2010
comment
Я также зарегистрировал ошибку JIRA для проблемы с тегами форм Spring: jira.springframework.org/ просмотреть/SPR-7042 - person Taylor Leese; 29.03.2010

Последние версии, которые мне удалось заставить работать вместе, — это Spring 3.0.1 и Spring Security 3.0.1. Использование Spring Security 3.0.2 дает исключение, описанное в вопросе. Я открыл ошибку в Spring Security здесь. Пожалуйста, проголосуйте за него, если вы столкнулись с этой проблемой.

Обновление. На основании отзыва Люка Тейлора об указанной ошибке она будет исправлена ​​в выпуске 3.0.3 и ветке 3.1.

person Taylor Leese    schedule 06.03.2010
comment
Он также работает с другой стороны (сохраняя Spring 3.0.1 и возвращаясь к Spring Security 3.0.0). Было бы здорово узнать причину... - person Guido; 08.03.2010
comment
Интересно, попробую. Я планирую открыть тикет в системе отслеживания ошибок Spring, но я не уверен, должен ли он идти в рамках обычных проектов Spring или Spring Security. - person Taylor Leese; 08.03.2010
comment
Похоже, Spring 3.0.1 и Spring Security 3.0.1 тоже работают. - person Taylor Leese; 09.03.2010
comment
Это исправлено в сборке 3.0.3 Snapshot. - person Taylor Leese; 18.03.2010