3 changed files with 178 additions and 175 deletions
@ -1,174 +0,0 @@
@@ -1,174 +0,0 @@
|
||||
/* |
||||
* Copyright 2002-2013 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.security.config.annotation.configuration |
||||
|
||||
import org.springframework.beans.factory.BeanClassLoaderAware |
||||
import org.springframework.beans.factory.BeanFactoryAware |
||||
import org.springframework.beans.factory.DisposableBean |
||||
import org.springframework.beans.factory.SmartInitializingSingleton |
||||
import org.springframework.beans.factory.annotation.Autowired |
||||
import org.springframework.beans.factory.config.AutowireCapableBeanFactory |
||||
import org.springframework.beans.factory.support.BeanNameGenerator; |
||||
import org.springframework.context.ApplicationContextAware |
||||
import org.springframework.context.ApplicationEventPublisherAware |
||||
import org.springframework.context.EnvironmentAware |
||||
import org.springframework.context.MessageSourceAware |
||||
import org.springframework.context.annotation.Bean |
||||
import org.springframework.context.annotation.Configuration |
||||
import org.springframework.context.support.ClassPathXmlApplicationContext |
||||
import org.springframework.mock.web.MockServletConfig |
||||
import org.springframework.mock.web.MockServletContext |
||||
import org.springframework.security.config.annotation.BaseSpringSpec |
||||
import org.springframework.security.config.annotation.ObjectPostProcessor |
||||
import org.springframework.web.context.ServletConfigAware |
||||
import org.springframework.web.context.ServletContextAware |
||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext |
||||
|
||||
/** |
||||
* |
||||
* @author Rob Winch |
||||
*/ |
||||
class AutowireBeanFactoryObjectPostProcessorTests extends BaseSpringSpec { |
||||
|
||||
def "Verify All Aware methods are invoked"() { |
||||
setup: |
||||
ApplicationContextAware contextAware = Mock(ApplicationContextAware) |
||||
ApplicationEventPublisherAware publisher = Mock(ApplicationEventPublisherAware) |
||||
BeanClassLoaderAware classloader = Mock(BeanClassLoaderAware) |
||||
BeanFactoryAware beanFactory = Mock(BeanFactoryAware) |
||||
EnvironmentAware environment = Mock(EnvironmentAware) |
||||
MessageSourceAware messageSource = Mock(MessageSourceAware) |
||||
ServletConfigAware servletConfig = Mock(ServletConfigAware) |
||||
ServletContextAware servletContext = Mock(ServletContextAware) |
||||
DisposableBean disposable = Mock(DisposableBean) |
||||
|
||||
context = new AnnotationConfigWebApplicationContext([servletConfig:new MockServletConfig(),servletContext:new MockServletContext()]) |
||||
context.register(Config) |
||||
context.refresh() |
||||
context.start() |
||||
|
||||
ObjectPostProcessor opp = context.getBean(ObjectPostProcessor) |
||||
when: |
||||
opp.postProcess(contextAware) |
||||
then: |
||||
1 * contextAware.setApplicationContext(!null) |
||||
|
||||
when: |
||||
opp.postProcess(publisher) |
||||
then: |
||||
1 * publisher.setApplicationEventPublisher(!null) |
||||
|
||||
when: |
||||
opp.postProcess(classloader) |
||||
then: |
||||
1 * classloader.setBeanClassLoader(!null) |
||||
|
||||
when: |
||||
opp.postProcess(beanFactory) |
||||
then: |
||||
1 * beanFactory.setBeanFactory(!null) |
||||
|
||||
when: |
||||
opp.postProcess(environment) |
||||
then: |
||||
1 * environment.setEnvironment(!null) |
||||
|
||||
when: |
||||
opp.postProcess(messageSource) |
||||
then: |
||||
1 * messageSource.setMessageSource(!null) |
||||
|
||||
when: |
||||
opp.postProcess(servletConfig) |
||||
then: |
||||
1 * servletConfig.setServletConfig(!null) |
||||
|
||||
when: |
||||
opp.postProcess(servletContext) |
||||
then: |
||||
1 * servletContext.setServletContext(!null) |
||||
|
||||
when: |
||||
opp.postProcess(disposable) |
||||
context.close() |
||||
context = null |
||||
then: |
||||
1 * disposable.destroy() |
||||
} |
||||
|
||||
@Configuration |
||||
static class Config { |
||||
@Bean |
||||
public ObjectPostProcessor objectPostProcessor(AutowireCapableBeanFactory beanFactory) { |
||||
return new AutowireBeanFactoryObjectPostProcessor(beanFactory); |
||||
} |
||||
} |
||||
|
||||
def "SEC-2382: AutowireBeanFactoryObjectPostProcessor works with BeanNameAutoProxyCreator"() { |
||||
when: |
||||
// must load with XML for BeanPostProcessors to work |
||||
context = new ClassPathXmlApplicationContext("AutowireBeanFactoryObjectPostProcessorTests-aopconfig.xml", getClass()); |
||||
then: |
||||
noExceptionThrown() |
||||
and: "make sure autoproxying was actually enabled" |
||||
context.getBean(MyAdvisedBean).doStuff() == "null" |
||||
} |
||||
|
||||
@Configuration |
||||
static class WithBanNameAutoProxyCreatorConfig { |
||||
@Bean |
||||
public ObjectPostProcessor objectPostProcessor(AutowireCapableBeanFactory beanFactory) { |
||||
return new AutowireBeanFactoryObjectPostProcessor(beanFactory) |
||||
} |
||||
|
||||
@Autowired |
||||
public void configure(ObjectPostProcessor<Object> p) { |
||||
p.postProcess(new Object()) |
||||
} |
||||
} |
||||
|
||||
def "SmartInitializingSingleton"() { |
||||
when: |
||||
context = new AnnotationConfigWebApplicationContext([servletConfig:new MockServletConfig(),servletContext:new MockServletContext()]) |
||||
context.register(SmartConfig) |
||||
context.refresh() |
||||
context.start() |
||||
then: |
||||
context.getBean(SmartConfig).smart.instantiated |
||||
} |
||||
|
||||
@Configuration |
||||
static class SmartConfig { |
||||
SmartInitializingSingleton smart = new SmartInitializingSingletonStub() |
||||
|
||||
@Bean |
||||
public static ObjectPostProcessor objectPostProcessor(AutowireCapableBeanFactory beanFactory) { |
||||
return new AutowireBeanFactoryObjectPostProcessor(beanFactory) |
||||
} |
||||
|
||||
@Autowired |
||||
public void configure(ObjectPostProcessor<Object> p) { |
||||
p.postProcess(smart) |
||||
} |
||||
} |
||||
|
||||
static class SmartInitializingSingletonStub implements SmartInitializingSingleton { |
||||
boolean instantiated |
||||
void afterSingletonsInstantiated() { |
||||
instantiated = true |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,177 @@
@@ -0,0 +1,177 @@
|
||||
/* |
||||
* Copyright 2002-2018 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.security.config.annotation.configuration; |
||||
|
||||
import org.junit.Rule; |
||||
import org.junit.Test; |
||||
import org.springframework.beans.factory.BeanClassLoaderAware; |
||||
import org.springframework.beans.factory.BeanFactoryAware; |
||||
import org.springframework.beans.factory.DisposableBean; |
||||
import org.springframework.beans.factory.SmartInitializingSingleton; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.beans.factory.config.AutowireCapableBeanFactory; |
||||
import org.springframework.context.ApplicationContextAware; |
||||
import org.springframework.context.ApplicationEventPublisherAware; |
||||
import org.springframework.context.EnvironmentAware; |
||||
import org.springframework.context.MessageSourceAware; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.security.config.annotation.ObjectPostProcessor; |
||||
import org.springframework.security.config.test.SpringTestRule; |
||||
import org.springframework.web.context.ServletContextAware; |
||||
|
||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat; |
||||
import static org.mockito.ArgumentMatchers.isNotNull; |
||||
import static org.mockito.Mockito.mock; |
||||
import static org.mockito.Mockito.verify; |
||||
|
||||
/** |
||||
* |
||||
* @author Rob Winch |
||||
*/ |
||||
public class AutowireBeanFactoryObjectPostProcessorTests { |
||||
@Rule |
||||
public final SpringTestRule spring = new SpringTestRule(); |
||||
|
||||
@Autowired |
||||
private ObjectPostProcessor<Object> objectObjectPostProcessor; |
||||
|
||||
@Test |
||||
public void postProcessWhenApplicationContextAwareThenAwareInvoked() { |
||||
this.spring.register(Config.class).autowire(); |
||||
|
||||
ApplicationContextAware toPostProcess = mock(ApplicationContextAware.class); |
||||
this.objectObjectPostProcessor.postProcess(toPostProcess); |
||||
verify(toPostProcess).setApplicationContext(isNotNull()); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenApplicationEventPublisherAwareThenAwareInvoked() { |
||||
this.spring.register(Config.class).autowire(); |
||||
|
||||
ApplicationEventPublisherAware toPostProcess = mock(ApplicationEventPublisherAware.class); |
||||
this.objectObjectPostProcessor.postProcess(toPostProcess); |
||||
verify(toPostProcess).setApplicationEventPublisher(isNotNull()); |
||||
|
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenBeanClassLoaderAwareThenAwareInvoked() { |
||||
this.spring.register(Config.class).autowire(); |
||||
|
||||
BeanClassLoaderAware toPostProcess = mock(BeanClassLoaderAware.class); |
||||
this.objectObjectPostProcessor.postProcess(toPostProcess); |
||||
verify(toPostProcess).setBeanClassLoader(isNotNull()); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenBeanFactoryAwareThenAwareInvoked() { |
||||
this.spring.register(Config.class).autowire(); |
||||
|
||||
BeanFactoryAware toPostProcess = mock(BeanFactoryAware.class); |
||||
this.objectObjectPostProcessor.postProcess(toPostProcess); |
||||
verify(toPostProcess).setBeanFactory(isNotNull()); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenEnvironmentAwareThenAwareInvoked() { |
||||
this.spring.register(Config.class).autowire(); |
||||
|
||||
EnvironmentAware toPostProcess = mock(EnvironmentAware.class); |
||||
this.objectObjectPostProcessor.postProcess(toPostProcess); |
||||
verify(toPostProcess).setEnvironment(isNotNull()); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenMessageSourceAwareThenAwareInvoked() { |
||||
this.spring.register(Config.class).autowire(); |
||||
|
||||
MessageSourceAware toPostProcess = mock(MessageSourceAware.class); |
||||
this.objectObjectPostProcessor.postProcess(toPostProcess); |
||||
verify(toPostProcess).setMessageSource(isNotNull()); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenServletContextAwareThenAwareInvoked() { |
||||
this.spring.register(Config.class).autowire(); |
||||
|
||||
ServletContextAware toPostProcess = mock(ServletContextAware.class); |
||||
this.objectObjectPostProcessor.postProcess(toPostProcess); |
||||
verify(toPostProcess).setServletContext(isNotNull()); |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenDisposableBeanThenAwareInvoked() throws Exception { |
||||
this.spring.register(Config.class).autowire(); |
||||
|
||||
DisposableBean toPostProcess = mock(DisposableBean.class); |
||||
this.objectObjectPostProcessor.postProcess(toPostProcess); |
||||
|
||||
this.spring.getContext().close(); |
||||
|
||||
verify(toPostProcess).destroy(); |
||||
} |
||||
|
||||
@Configuration |
||||
static class Config { |
||||
@Bean |
||||
public ObjectPostProcessor objectPostProcessor(AutowireCapableBeanFactory beanFactory) { |
||||
return new AutowireBeanFactoryObjectPostProcessor(beanFactory); |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
public void postProcessWhenSmartInitializingSingletonThenAwareInvoked() { |
||||
this.spring.register(Config.class, SmartConfig.class).autowire(); |
||||
|
||||
SmartConfig config = this.spring.getContext().getBean(SmartConfig.class); |
||||
|
||||
verify(config.toTest).afterSingletonsInstantiated(); |
||||
} |
||||
|
||||
@Configuration |
||||
static class SmartConfig { |
||||
SmartInitializingSingleton toTest = mock(SmartInitializingSingleton.class); |
||||
|
||||
@Autowired |
||||
public void configure(ObjectPostProcessor<Object> p) { |
||||
p.postProcess(this.toTest); |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
// SEC-2382
|
||||
public void autowireBeanFactoryWhenBeanNameAutoProxyCreatorThenWorks() throws Exception { |
||||
this.spring.testConfigLocations("AutowireBeanFactoryObjectPostProcessorTests-aopconfig.xml").autowire(); |
||||
|
||||
MyAdvisedBean bean = this.spring.getContext().getBean(MyAdvisedBean.class); |
||||
|
||||
assertThat(bean.doStuff()).isEqualTo("null"); |
||||
} |
||||
|
||||
@Configuration |
||||
static class WithBeanNameAutoProxyCreatorConfig { |
||||
@Bean |
||||
public ObjectPostProcessor objectPostProcessor(AutowireCapableBeanFactory beanFactory) { |
||||
return new AutowireBeanFactoryObjectPostProcessor(beanFactory); |
||||
} |
||||
|
||||
@Autowired |
||||
public void configure(ObjectPostProcessor<Object> p) { |
||||
p.postProcess(new Object()); |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue