|
35 | 35 | import org.junit.jupiter.api.extension.ExtendWith;
|
36 | 36 |
|
37 | 37 | import org.springframework.aop.Advisor;
|
| 38 | +import org.springframework.aop.config.AopConfigUtils; |
38 | 39 | import org.springframework.aop.support.DefaultPointcutAdvisor;
|
39 | 40 | import org.springframework.aop.support.JdkRegexpMethodPointcut;
|
| 41 | +import org.springframework.beans.factory.FactoryBean; |
40 | 42 | import org.springframework.beans.factory.annotation.Autowired;
|
41 | 43 | import org.springframework.beans.factory.config.BeanDefinition;
|
| 44 | +import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; |
42 | 45 | import org.springframework.context.annotation.AdviceMode;
|
43 | 46 | import org.springframework.context.annotation.Bean;
|
44 | 47 | import org.springframework.context.annotation.Configuration;
|
|
63 | 66 | import org.springframework.security.authorization.AuthorizationDecision;
|
64 | 67 | import org.springframework.security.authorization.AuthorizationEventPublisher;
|
65 | 68 | import org.springframework.security.authorization.AuthorizationManager;
|
| 69 | +import org.springframework.security.authorization.method.AuthorizationAdvisor; |
66 | 70 | import org.springframework.security.authorization.method.AuthorizationAdvisorProxyFactory;
|
67 | 71 | import org.springframework.security.authorization.method.AuthorizationAdvisorProxyFactory.TargetVisitor;
|
68 | 72 | import org.springframework.security.authorization.method.AuthorizationInterceptorsOrder;
|
|
82 | 86 | import org.springframework.security.test.context.support.WithAnonymousUser;
|
83 | 87 | import org.springframework.security.test.context.support.WithMockUser;
|
84 | 88 | import org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener;
|
| 89 | +import org.springframework.stereotype.Component; |
85 | 90 | import org.springframework.test.context.ContextConfiguration;
|
86 | 91 | import org.springframework.test.context.TestExecutionListeners;
|
87 | 92 | import org.springframework.test.context.junit.jupiter.SpringExtension;
|
@@ -953,6 +958,32 @@ void annotationsInChildClassesDoNotAffectSuperclasses() {
|
953 | 958 | this.spring.getContext().getBean(ClassInheritingAbstractClassWithNoAnnotations.class).method();
|
954 | 959 | }
|
955 | 960 |
|
| 961 | + // gh-15592 |
| 962 | + @Test |
| 963 | + void autowireWhenDefaultsThenCreatesExactlyOneAdvisorPerAnnotation() { |
| 964 | + this.spring.register(MethodSecurityServiceConfig.class).autowire(); |
| 965 | + AuthorizationAdvisorProxyFactory proxyFactory = this.spring.getContext() |
| 966 | + .getBean(AuthorizationAdvisorProxyFactory.class); |
| 967 | + assertThat(proxyFactory).hasSize(5); |
| 968 | + assertThat(this.spring.getContext().getBeanNamesForType(AuthorizationAdvisor.class)).hasSize(5) |
| 969 | + .containsExactlyInAnyOrder("preFilterAuthorizationMethodInterceptor", |
| 970 | + "preAuthorizeAuthorizationMethodInterceptor", "postAuthorizeAuthorizationMethodInterceptor", |
| 971 | + "postFilterAuthorizationMethodInterceptor", "authorizeReturnObjectMethodInterceptor"); |
| 972 | + } |
| 973 | + |
| 974 | + // gh-15592 |
| 975 | + @Test |
| 976 | + void autowireWhenAspectJAutoProxyAndFactoryBeanThenExactlyOneAdvisorPerAnnotation() { |
| 977 | + this.spring.register(AspectJAwareAutoProxyAndFactoryBeansConfig.class).autowire(); |
| 978 | + AuthorizationAdvisorProxyFactory proxyFactory = this.spring.getContext() |
| 979 | + .getBean(AuthorizationAdvisorProxyFactory.class); |
| 980 | + assertThat(proxyFactory).hasSize(5); |
| 981 | + assertThat(this.spring.getContext().getBeanNamesForType(AuthorizationAdvisor.class)).hasSize(5) |
| 982 | + .containsExactlyInAnyOrder("preFilterAuthorizationMethodInterceptor", |
| 983 | + "preAuthorizeAuthorizationMethodInterceptor", "postAuthorizeAuthorizationMethodInterceptor", |
| 984 | + "postFilterAuthorizationMethodInterceptor", "authorizeReturnObjectMethodInterceptor"); |
| 985 | + } |
| 986 | + |
956 | 987 | private static Consumer<ConfigurableWebApplicationContext> disallowBeanOverriding() {
|
957 | 988 | return (context) -> ((AnnotationConfigWebApplicationContext) context).setAllowBeanDefinitionOverriding(false);
|
958 | 989 | }
|
@@ -1514,4 +1545,30 @@ ClassInheritingAbstractClassWithNoAnnotations inheriting() {
|
1514 | 1545 |
|
1515 | 1546 | }
|
1516 | 1547 |
|
| 1548 | + @Configuration |
| 1549 | + @EnableMethodSecurity |
| 1550 | + static class AspectJAwareAutoProxyAndFactoryBeansConfig { |
| 1551 | + |
| 1552 | + @Bean |
| 1553 | + static BeanDefinitionRegistryPostProcessor beanDefinitionRegistryPostProcessor() { |
| 1554 | + return AopConfigUtils::registerAspectJAnnotationAutoProxyCreatorIfNecessary; |
| 1555 | + } |
| 1556 | + |
| 1557 | + @Component |
| 1558 | + static class MyFactoryBean implements FactoryBean<Object> { |
| 1559 | + |
| 1560 | + @Override |
| 1561 | + public Object getObject() throws Exception { |
| 1562 | + return new Object(); |
| 1563 | + } |
| 1564 | + |
| 1565 | + @Override |
| 1566 | + public Class<?> getObjectType() { |
| 1567 | + return Object.class; |
| 1568 | + } |
| 1569 | + |
| 1570 | + } |
| 1571 | + |
| 1572 | + } |
| 1573 | + |
1517 | 1574 | }
|
0 commit comments