|
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