diff --git a/config/src/main/java/org/springframework/security/config/annotation/method/configuration/Jsr250MethodSecurityConfiguration.java b/config/src/main/java/org/springframework/security/config/annotation/method/configuration/Jsr250MethodSecurityConfiguration.java index e3a799f1e9e..8ad32205935 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/method/configuration/Jsr250MethodSecurityConfiguration.java +++ b/config/src/main/java/org/springframework/security/config/annotation/method/configuration/Jsr250MethodSecurityConfiguration.java @@ -17,9 +17,9 @@ package org.springframework.security.config.annotation.method.configuration; import io.micrometer.observation.ObservationRegistry; +import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; -import org.springframework.aop.Advisor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Bean; @@ -46,7 +46,8 @@ final class Jsr250MethodSecurityConfiguration { @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - Advisor jsr250AuthorizationMethodInterceptor(ObjectProvider defaultsProvider, + static MethodInterceptor jsr250AuthorizationMethodInterceptor( + ObjectProvider defaultsProvider, ObjectProvider strategyProvider, ObjectProvider registryProvider) { Jsr250AuthorizationManager jsr250 = new Jsr250AuthorizationManager(); diff --git a/config/src/main/java/org/springframework/security/config/annotation/method/configuration/MethodSecurityAdvisorRegistrar.java b/config/src/main/java/org/springframework/security/config/annotation/method/configuration/MethodSecurityAdvisorRegistrar.java new file mode 100644 index 00000000000..3735117cf37 --- /dev/null +++ b/config/src/main/java/org/springframework/security/config/annotation/method/configuration/MethodSecurityAdvisorRegistrar.java @@ -0,0 +1,52 @@ +/* + * Copyright 2002-2023 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 + * + * https://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.method.configuration; + +import org.springframework.aop.Advisor; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.core.type.AnnotationMetadata; + +class MethodSecurityAdvisorRegistrar implements ImportBeanDefinitionRegistrar { + + @Override + public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { + registerAsAdvisor("preFilterAuthorization", registry); + registerAsAdvisor("preAuthorizeAuthorization", registry); + registerAsAdvisor("postFilterAuthorization", registry); + registerAsAdvisor("postAuthorizeAuthorization", registry); + registerAsAdvisor("securedAuthorization", registry); + registerAsAdvisor("jsr250Authorization", registry); + } + + private void registerAsAdvisor(String prefix, BeanDefinitionRegistry registry) { + String interceptorName = prefix + "MethodInterceptor"; + if (!registry.containsBeanDefinition(interceptorName)) { + return; + } + BeanDefinition definition = registry.getBeanDefinition(interceptorName); + if (!(definition instanceof RootBeanDefinition)) { + return; + } + RootBeanDefinition advisor = new RootBeanDefinition((RootBeanDefinition) definition); + advisor.setTargetType(Advisor.class); + registry.registerBeanDefinition(prefix + "Advisor", advisor); + } + +} diff --git a/config/src/main/java/org/springframework/security/config/annotation/method/configuration/MethodSecuritySelector.java b/config/src/main/java/org/springframework/security/config/annotation/method/configuration/MethodSecuritySelector.java index a18578dc59e..4b561360a73 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/method/configuration/MethodSecuritySelector.java +++ b/config/src/main/java/org/springframework/security/config/annotation/method/configuration/MethodSecuritySelector.java @@ -61,7 +61,8 @@ public String[] selectImports(@NonNull AnnotationMetadata importMetadata) { private static final class AutoProxyRegistrarSelector extends AdviceModeImportSelector { - private static final String[] IMPORTS = new String[] { AutoProxyRegistrar.class.getName() }; + private static final String[] IMPORTS = new String[] { AutoProxyRegistrar.class.getName(), + MethodSecurityAdvisorRegistrar.class.getName() }; private static final String[] ASPECTJ_IMPORTS = new String[] { MethodSecurityAspectJAutoProxyRegistrar.class.getName() }; diff --git a/config/src/main/java/org/springframework/security/config/annotation/method/configuration/PrePostMethodSecurityConfiguration.java b/config/src/main/java/org/springframework/security/config/annotation/method/configuration/PrePostMethodSecurityConfiguration.java index 3f1e14723bc..c3bb88c8f4c 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/method/configuration/PrePostMethodSecurityConfiguration.java +++ b/config/src/main/java/org/springframework/security/config/annotation/method/configuration/PrePostMethodSecurityConfiguration.java @@ -17,8 +17,8 @@ package org.springframework.security.config.annotation.method.configuration; import io.micrometer.observation.ObservationRegistry; +import org.aopalliance.intercept.MethodInterceptor; -import org.springframework.aop.Advisor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.ApplicationContext; @@ -52,7 +52,8 @@ final class PrePostMethodSecurityConfiguration { @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - Advisor preFilterAuthorizationMethodInterceptor(ObjectProvider defaultsProvider, + static MethodInterceptor preFilterAuthorizationMethodInterceptor( + ObjectProvider defaultsProvider, ObjectProvider expressionHandlerProvider, ObjectProvider strategyProvider, ApplicationContext context) { PreFilterAuthorizationMethodInterceptor preFilter = new PreFilterAuthorizationMethodInterceptor(); @@ -64,7 +65,8 @@ Advisor preFilterAuthorizationMethodInterceptor(ObjectProvider defaultsProvider, + static MethodInterceptor preAuthorizeAuthorizationMethodInterceptor( + ObjectProvider defaultsProvider, ObjectProvider expressionHandlerProvider, ObjectProvider strategyProvider, ObjectProvider eventPublisherProvider, @@ -81,7 +83,8 @@ Advisor preAuthorizeAuthorizationMethodInterceptor(ObjectProvider defaultsProvider, + static MethodInterceptor postAuthorizeAuthorizationMethodInterceptor( + ObjectProvider defaultsProvider, ObjectProvider expressionHandlerProvider, ObjectProvider strategyProvider, ObjectProvider eventPublisherProvider, @@ -98,7 +101,8 @@ Advisor postAuthorizeAuthorizationMethodInterceptor(ObjectProvider defaultsProvider, + static MethodInterceptor postFilterAuthorizationMethodInterceptor( + ObjectProvider defaultsProvider, ObjectProvider expressionHandlerProvider, ObjectProvider strategyProvider, ApplicationContext context) { PostFilterAuthorizationMethodInterceptor postFilter = new PostFilterAuthorizationMethodInterceptor(); diff --git a/config/src/main/java/org/springframework/security/config/annotation/method/configuration/SecuredMethodSecurityConfiguration.java b/config/src/main/java/org/springframework/security/config/annotation/method/configuration/SecuredMethodSecurityConfiguration.java index adf94985a52..9e60170a640 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/method/configuration/SecuredMethodSecurityConfiguration.java +++ b/config/src/main/java/org/springframework/security/config/annotation/method/configuration/SecuredMethodSecurityConfiguration.java @@ -17,9 +17,9 @@ package org.springframework.security.config.annotation.method.configuration; import io.micrometer.observation.ObservationRegistry; +import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; -import org.springframework.aop.Advisor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Bean; @@ -46,7 +46,8 @@ final class SecuredMethodSecurityConfiguration { @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - Advisor securedAuthorizationMethodInterceptor(ObjectProvider strategyProvider, + static MethodInterceptor securedAuthorizationMethodInterceptor( + ObjectProvider strategyProvider, ObjectProvider registryProvider) { SecuredAuthorizationManager secured = new SecuredAuthorizationManager(); SecurityContextHolderStrategy strategy = strategyProvider