Skip to content

Commit 5c604b9

Browse files
committed
Correct PostFilterAuthorizationMethodInterceptor Target Type
Previously, `postFilterAuthorizationMethodInterceptor` mistakenly was published as an `Advisor`. Because `MethodSecurityAdvisorRegistrar` re-publishes each pre/post annotation interceptor also as an `Advisor`, this resulted in a duplicate advisor for `@PostFilter`. Closes gh-15651
1 parent e92a945 commit 5c604b9

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

config/src/main/java/org/springframework/security/config/annotation/method/configuration/PrePostMethodSecurityConfiguration.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import org.aopalliance.intercept.MethodInterceptor;
2020

21-
import org.springframework.aop.Advisor;
2221
import org.springframework.beans.factory.annotation.Autowired;
2322
import org.springframework.beans.factory.config.BeanDefinition;
2423
import org.springframework.context.ApplicationContext;
@@ -100,7 +99,7 @@ MethodInterceptor postAuthorizeAuthorizationMethodInterceptor() {
10099

101100
@Bean
102101
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
103-
Advisor postFilterAuthorizationMethodInterceptor() {
102+
MethodInterceptor postFilterAuthorizationMethodInterceptor() {
104103
return this.postFilterAuthorizationMethodInterceptor;
105104
}
106105

config/src/test/java/org/springframework/security/config/annotation/method/configuration/PrePostMethodSecurityConfigurationTests.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@
7373
import static org.mockito.ArgumentMatchers.any;
7474
import static org.mockito.Mockito.atLeastOnce;
7575
import static org.mockito.Mockito.mock;
76+
import static org.mockito.Mockito.spy;
77+
import static org.mockito.Mockito.times;
7678
import static org.mockito.Mockito.verify;
7779

7880
/**
@@ -432,6 +434,18 @@ public void configureWhenBeanOverridingDisallowedThenWorks() {
432434
.autowire();
433435
}
434436

437+
// gh-15651
438+
@Test
439+
@WithMockUser(roles = "ADMIN")
440+
public void adviseWhenPrePostEnabledThenEachInterceptorRunsExactlyOnce() {
441+
this.spring.register(MethodSecurityServiceConfig.class, CustomMethodSecurityExpressionHandlerConfig.class)
442+
.autowire();
443+
MethodSecurityExpressionHandler expressionHandler = this.spring.getContext()
444+
.getBean(MethodSecurityExpressionHandler.class);
445+
this.methodSecurityService.manyAnnotations(new ArrayList<>(Arrays.asList("harold", "jonathan", "tim", "bo")));
446+
verify(expressionHandler, times(4)).createEvaluationContext(any(Supplier.class), any());
447+
}
448+
435449
private static Consumer<ConfigurableWebApplicationContext> disallowBeanOverriding() {
436450
return (context) -> ((AnnotationConfigWebApplicationContext) context).setAllowBeanDefinitionOverriding(false);
437451
}
@@ -491,6 +505,19 @@ MethodSecurityService methodSecurityService() {
491505

492506
}
493507

508+
@EnableMethodSecurity
509+
static class CustomMethodSecurityExpressionHandlerConfig {
510+
511+
private final MethodSecurityExpressionHandler expressionHandler = spy(
512+
new DefaultMethodSecurityExpressionHandler());
513+
514+
@Bean
515+
MethodSecurityExpressionHandler methodSecurityExpressionHandler() {
516+
return this.expressionHandler;
517+
}
518+
519+
}
520+
494521
@EnableMethodSecurity
495522
static class CustomPermissionEvaluatorConfig {
496523

0 commit comments

Comments
 (0)