Grails - простое приложение для тестирования защищенного канала Spring-Security-Core на Heroku - PullRequest
2 голосов
/ 02 февраля 2012

Поскольку установка портов в этом вопросе не решила проблему петли перенаправления, я создал тестовое приложение «голыми костями» (Grails 2.0, последнее Spring-security-core 1.2.7.1), поэтомуПроблема с циклом перенаправления легко воспроизвести / надеюсь решить: Вот шаги:

1 - Создано новое приложение с именем test и создан контроллер с именем simple (также в тестовом пакете), то есть:

   package test

   class SimpleController {
       def index()  { redirect action: 'start'    }
       def start()  { render "start - not secure" }
       def middle() { render "middle - secure"    }
       def end()    { render "end - not secure"   }
   }  

2 - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 101 ';' * * * * *.*

3- В Config.groovy добавлены следующие строки, а затем run-app -https для проверки на моем компьютере разработчика:

   grails.plugins.springsecurity.secureChannel.definition = [
     '/simple/middle/**':    'REQUIRES_SECURE_CHANNEL',
     '/simple/end/**':       'REQUIRES_INSECURE_CHANNEL',
     '/simple/**':           'ANY_CHANNEL'
   ]

РЕЗУЛЬТАТ: все извлечены, можно ввести URL-адреса ../simple/start, а затем, введя ../simple/middle, переходит в режим SSL / https по желанию.

4- В Config.groovy я тогданастроил порты для работы на Heroku (предположительно, не найдено документов / ссылок):

  grails.plugins.springsecurity.portMapper.httpPort = '80'
  grails.plugins.springsecurity.portMapper.httpsPort = '443'

5 - После выполнения шагов git init , git add. , git commit -m "initial commit" и heroku create --stack cedar , я пошел в Heroku и добавил SSL PiggyBack во вновь созданное приложение.Затем я выполнил git push heroku master для развертывания.

РЕЗУЛЬТАТ: Получил общее "IllegalStateException, запрос с привязкой к потоку не найден", проблема описана здесь и здесь .

6- Таким образом, в BuildConfig.groovy я сделал следующие 2 изменения в разделе плагинов {}:

    //runtime ":resources:1.1.5"
    compile ":webxml:1.4.1"   

РЕЗУЛЬТАТ: IllegalStateException исчезает, и я могуполучить доступ к простому контроллеру (и контроллеру входа).Я могу префикс этих URL с https, и все хорошо.Однако, если я введу URL-адрес ../simple/middle, я получу цикл перенаправления (следы, подобные здесь ).

7 - Из любопытства я прокомментировал половину изменения вшаг 6, а именно // compile: "webxml: 1.4.1" :

РЕЗУЛЬТАТ: получено то же IllegalStateException

8- Поскольку я не былЯ не уверен, как плагины поддержки heroku и cloud-ов включены в основные шаги, описанные выше, я ждал, чтобы добавить их до этого шага.Затем я сделал grails install-plugin cloud-support и grails install-plugin heroku , и обновил BuildConfig.groovy, чтобы он теперь выгляделнапример:

   plugins {
     runtime ":hibernate:$grailsVersion"
     runtime ":jquery:1.7.1"

      //runtime ":resources:1.1.5"
      //compile ":webxml:1.4.1"
      compile ':heroku:1.0'
      compile ':cloud-support:1.0.8'

      compile ":tomcat:$grailsVersion"
   }

, затем clean , обновил репозиторий git и вытолкнул на heroku.

RESULT: то же IllegalStateException (обратите внимание, что зависимость webxml закомментирована).

9 - затем я раскомментировал compile ": webxml: 1.4.1" и снова вытолкнул на heroku:

RESULT: точно так же, как в шаге 3. Т.е., за исключением ../simple/middle, все URL работают, включая добавление префикса https.Переход к URL-адресу ../simple/middle вызывает проблему с циклом перенаправления.

Не могли бы вы посоветовать, как решить эту проблему?Если у меня есть что попробовать (например, неопределенное решение), просто обновите раздел comments , и я отвечу вам результатами.Большое спасибо.

------------------------------------------------------------------------------------------

Обновление с использованием новой весенней защиты 1.2.7.2.

My BuildConfig.groovy теперь:

 dependencies {
    // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.
    runtime 'mysql:mysql-connector-java:5.1.16'
}

plugins {
    runtime ":hibernate:$grailsVersion"
    runtime ":jquery:1.7.1"

    runtime ":resources:1.1.6"
    compile ":spring-security-core:1.2.7.2"

    compile ":webxml:1.4.1"

    compile ':heroku:1.0'
    compile ':cloud-support:1.0.8'

    build ":tomcat:$grailsVersion"
}

Получена ошибка зависимости PostGres при развертывании в Heroku даже при использовании MySql.Поэтому я удалил все приложения на Heroku и сдул свой репозиторий git и начал с нового приложения развертывания / обновления.

Все еще получаю эту ошибку зависимости PostGres (ниже).Примечание: ранее получалось предупреждение «Не найден менеджер транзакций - если вашему веб-приложению требуется один, настройте его», когда работал MySql.Хм.

  12-02-03T07:18:09+00:00 app[web.1]: 2012-02-03 07:18:09.810:INFO:omjr.Runner:Runner
  12-02-03T07:18:09+00:00 app[web.1]: 2012-02-03 07:18:09.811:WARN:omjr.Runner:No tx manager found
  12-02-03T07:18:09+00:00 app[web.1]: 2012-02-03 07:18:09.852:INFO:omjr.Runner:Deploying  file:/app/target/momentum-0.1.war @ /
  12-02-03T07:18:09+00:00 app[web.1]: 2012-02-03 07:18:09.869:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
 12-02-03T07:18:09+00:00 app[web.1]: [o.e.j.w.WebAppContext{/,null},file:/app/target/momentum-0.1.war]
 12-02-03T07:18:09+00:00 app[web.1]: 2012-02-03  07:18:09.915:INFO:oejw.WebInfConfiguration:Extract jar:file:/app/target/momentum-0.1.war!/ to   /tmp/jetty-0.0.0.0-43683-momentum-0.1.war-_-any-/webapp
 12-02-03T07:18:14+00:00 app[web.1]: 2012-02-03 07:18:14.500:INFO:oejpw.PlusConfiguration:No Transaction manager found - if your webapp requires one, please configure one.
 12-02-03T07:18:18+00:00 app[web.1]: 2012-02-03 07:18:18.361:INFO:/:Initializing Spring root WebApplicationContext
 12-02-03T07:18:24+00:00 app[web.1]:
 12-02-03T07:18:24+00:00 app[web.1]: Configuring Spring Security Core ...
 12-02-03T07:18:24+00:00 app[web.1]: ... finished configuring Spring Security Core
 12-02-03T07:18:24+00:00 app[web.1]:
 12-02-03T07:18:24+00:00 app[web.1]: 2012-02-03 07:18:24.490:WARN:oejw.WebAppContext:Failed    startup of context o.e.j.w.WebAppContext{/,file:/tmp/jetty-0.0.0.0-43683-momentum-0.1.war-_-any- /webapp/},file:/a
   /target/momentum-0.1.war
   12-02-03T07:18:24+00:00 app[web.1]: org.springframework.beans.factory.BeanCreationException:   Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; 
    ************************************************************   
    nested exception is org.springframework.beans.factory.BeanCreationException: Error  creating bean with name 'sessionFactory': Cannot resolve reference to bean 'lobHandlerDetector' while  setting bean property 'lobHandler'; 
      nested exception is org.springframework.beans.factory.BeanCreationException:  Error creating bean with name 'lobHandlerDetector': Invocation of init method failed; 
   nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.postgresql.Driver'
   *************************************************************

  12-02-03T07:18:24+00:00 app[web.1]:   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory.doCreateBean(ReloadAwareAutowireCapableBeanFactory.java:126)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:707)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:449)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.codehaus.groovy.grails.commons.spring.DefaultRuntimeSpringConfiguration.getApplicationContext(DefaultRuntimeSpringConfiguration.java:153)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.codehaus.groovy.grails.commons.spring.GrailsRuntimeConfigurator.configure(GrailsRuntimeConfigurator.java:124)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.codehaus.groovy.grails.commons.spring.GrailsRuntimeConfigurator.configure(GrailsRuntimeConfigurator.java:165)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.codehaus.groovy.grails.web.context.GrailsConfigUtils.configureWebApplicationContext(GrailsConfigUtils.java:121)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.codehaus.groovy.grails.web.context.GrailsContextLoader.initWebApplicationContext(GrailsContextLoader.java:104)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:643)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:233)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1213)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:589)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:454)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
  12-02-03T07:18:24+00:00 app[web.1]:   at  org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:224)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:167)
  12-02-03T07:18:24+00:00 app[web.1]:   at  org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:89)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.server.Server.doStart(Server.java:261)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.mortbay.jetty.runner.Runner.run(Runner.java:500)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.mortbay.jetty.runner.Runner.main(Runner.java:639)
  12-02-03T07:18:24+00:00 app[web.1]:   at org.eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.java:224)

1 Ответ

2 голосов
/ 03 февраля 2012

Вероятно, лучше не просто случайным образом взламывать вещи, если вы не знаете, почему они там есть:)

Исключение IllegalStateException происходит из-за неправильного порядка элементов filter-mapping в web.xml.Spring-security-core и ресурсы располагали элементы filter-mapping и наступали друг на друга, поэтому мы обновили плагин webxml для поддержки этого соглашения и сделали так, чтобы оба плагина зависели от этого.Из-за ошибок в удалении плагинов с различными зависимыми версиями плагинов важно, чтобы вы использовали версии Spring-Security-Core и ресурсы, которые зависят от одной и той же версии webxml.

Новые приложения 2.0 объявляют зависимость от ресурсов 1.1.5, который использует webxml v1.4, а spring-security-core 1.2.7+ использует 1.4.1, поэтому вам нужно либо не использовать ресурсы, либо использовать версию 1.1.6.Тогда нет никакой двусмысленности, и будет использоваться правильная версия, и порядок web.xml будет правильным.Вы также должны зарегистрировать все плагины в BuildConfig и не использовать install-plugin;это сохранит все в одном месте и позволит вам определять исключения и т. д.

Однако все это не зависит от проблем SSL, поэтому лучше сосредоточиться на одной проблеме за раз.Я не использовал SSL на Heroku, поэтому я не знаю, какие порты они используют.Я предполагаю, что внутри брандмауэра они используют что-то отличное от 443, а затем запросы перенаправляются на 443. Но это не зависит от Grails и плагина core-security-core, поэтому выяснение того, как настроен SSL, является лишь общей проблемой документации.1009 *

Обновление

Хорошо, поэтому, основываясь на обходном пути по ссылке, опубликованной Джеймсом, я выпустил новую версию плагина Spring Security (v1.2.7.2) с поддержкой X-Forwarded-Proto.Добавьте grails.plugins.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true к Config.groovy, и он будет использовать этот подход вместо более простой проверки безопасности / ненадежности.И IllegalStateException из-за ошибки в способе, которым Heroku развертывает приложения Grails 2.0.При построении войны зависимости плагинов не разрешаются, поэтому вам нужно быть явным.Поэтому обязательно добавьте

compile ":spring-security-core:1.2.7.2"
compile ':webxml:1.4.1'
compile ":heroku:1.0"
compile ':cloud-support:1.0.8'

к BuildConfig.groovy, чтобы убедиться, что webxml (зависимость от ядра безопасности Spring) и поддержка облака (зависимость от HeroUK) установлены и развернуты.

...