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 95a5841765..f1304f6393 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * 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. @@ -16,7 +16,8 @@ package org.springframework.security.config.annotation.method.configuration; -import org.springframework.aop.Advisor; +import org.aopalliance.intercept.MethodInterceptor; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Bean; @@ -47,7 +48,7 @@ final class Jsr250MethodSecurityConfiguration { @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - Advisor jsr250AuthorizationMethodInterceptor() { + MethodInterceptor jsr250AuthorizationMethodInterceptor() { AuthorizationManagerBeforeMethodInterceptor interceptor = AuthorizationManagerBeforeMethodInterceptor .jsr250(this.jsr250AuthorizationManager); interceptor.setSecurityContextHolderStrategy(this.securityContextHolderStrategy); 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 0000000000..3735117cf3 --- /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 f0ee6d4630..9a0d08a902 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * 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. @@ -60,7 +60,8 @@ final class MethodSecuritySelector implements ImportSelector { 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 1c2a48be72..d54d6f26e7 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * 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. @@ -16,6 +16,8 @@ package org.springframework.security.config.annotation.method.configuration; +import org.aopalliance.intercept.MethodInterceptor; + import org.springframework.aop.Advisor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; @@ -80,19 +82,19 @@ final class PrePostMethodSecurityConfiguration { @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - Advisor preFilterAuthorizationMethodInterceptor() { + MethodInterceptor preFilterAuthorizationMethodInterceptor() { return this.preFilterAuthorizationMethodInterceptor; } @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - Advisor preAuthorizeAuthorizationMethodInterceptor() { + MethodInterceptor preAuthorizeAuthorizationMethodInterceptor() { return this.preAuthorizeAuthorizationMethodInterceptor; } @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - Advisor postAuthorizeAuthorizationMethodInterceptor() { + MethodInterceptor postAuthorizeAuthorizationMethodInterceptor() { return this.postAuthorizeAuthorizaitonMethodInterceptor; } 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 2e30c747a4..f8f54d4f53 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * 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. @@ -16,7 +16,8 @@ package org.springframework.security.config.annotation.method.configuration; -import org.springframework.aop.Advisor; +import org.aopalliance.intercept.MethodInterceptor; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Bean; @@ -44,7 +45,7 @@ final class SecuredMethodSecurityConfiguration { @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - Advisor securedAuthorizationMethodInterceptor() { + MethodInterceptor securedAuthorizationMethodInterceptor() { AuthorizationManagerBeforeMethodInterceptor interceptor = AuthorizationManagerBeforeMethodInterceptor.secured(); interceptor.setSecurityContextHolderStrategy(this.securityContextHolderStrategy); return interceptor;