2014-07-06 6 views
2

임베디드 tomcat에서 실행되지 않지만 호스트 된 tomcat 설치에서 정상적으로 실행되는 스프링 부트 응용 프로그램이 있습니다. 설정은 Spring Boot 1.0.0.RELEASE 이전에 작동했지만 변경된 사항을 확인할 수 없습니다.스프링 부트/보안 - 임베디드 Tomcat에서 실행할 때 보안을 사용자 정의 할 수 없음

기본적으로 내 앱에는 "ServletContext"에 대한 개념이 없으므로로드시 특정 부분이 날아갑니다. 구성의 순서 (특히 보안)가 인스턴스화 된 문제라는 언급을 몇 가지 보았지만 문제를 해결할 수는 없습니다. SecurityConfig.java에서 @Configuration 주석을 제거하면 응용 프로그램을로드 할 수 있지만 필요에 따라 보안을 사용자 정의 할 수 없습니다. 또한 해당 클래스에 @Order를 추가해도 아무런 효과가 없습니다. 어떤 도움이

스택 트레이스를 감상 할 수 DemoApplication.java & SecurityConfig.java

전체 프로젝트 관련 조각 pom.xml 인으로, here를 호스팅

는 :

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultServletHandlerMapping' defined in class org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration: Instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.web.servlet.HandlerMapping org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping()] threw exception; nested exception is java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:597) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1094) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:989) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:683) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) 
    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:142) 
    at com.github.lemniscate.stack.boot.DemoApplication.main(DemoApplication.java:64) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.web.servlet.HandlerMapping org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping()] threw exception; nested exception is java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:188) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:586) 
    ... 21 more 
Caused by: java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 
    at org.springframework.util.Assert.notNull(Assert.java:112) 
    at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.<init>(DefaultServletHandlerConfigurer.java:54) 
    at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.java:346) 
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerBySpringCGLIB$$d9a689bd.CGLIB$defaultServletHandlerMapping$23(<generated>) 
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerBySpringCGLIB$$d9a689bd$$FastClassBySpringCGLIB$$aa3e36b5.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:312) 
    at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration$$EnhancerBySpringCGLIB$$d9a689bd.defaultServletHandlerMapping(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:166) 
    ... 22 more 
+0

'@ EnableApiResources '는 범인입니다. http://chat.stackoverflow.com/rooms/56869/24598959 –

답변

2

우리는이를 아래로 추적 @EnableGlobalMethodSecurity의 조합으로 채팅하고에 JPA를 사용하는 채팅(둘 중 하나만 작동) 이 부분의 적어도 일부를 추적 할 수있는 스프링 보안 문제가 있습니다 : https://jira.spring.io/browse/SEC-2661.

해결 방법 : @EnableGlobalMethodSecurity을 사용하지 않거나 UserDetails에 JPA를 사용하지 마십시오. 인증 작성 도구에 주입 할 때가 아니라 UserDetailsService을 사용하면 지연 설치가 늦어 질 수 있습니다.

+0

그래서 UserDetailsService 구현체가 Spring 데이터 저장소를 여전히 사용하지만 UserDetails 객체를 풀어 보려고했습니다. ,하지만 그건 괜찮을거야, 맞지? 서비스의 지연 인스턴스화도 시도했지만 주사위는 사용하지 않았습니다. '@ EnableGlobalMethodSecurity'를 제거했지만 @Secured 주석을 사용할 수 없습니다. 다른 방법으로 사용할 수있게하려면 어떻게해야합니까? 'GlobalMethodSecurityConfiguration'을 서브 클래 싱하지 않았지만 같은 보트에서 끝낼 것 같은 느낌이 들었습니다. –

+0

'GlobalMethodSecurityConfiguration'이 확실히 권장됩니다 만, 그걸로조차 작동하도록 코드를 얻을 수 없었습니다. 나는 그걸로 좀 더 국수를 먹을지도 모른다. –

+0

그건 정말 고마워. 고마워. 제가 생각할 수있는 유일한 해결책은 커스텀 어노테이션 + AOP 조언이 될 것입니다. –