Skip to content

Commit 5841e35

Browse files
committed
Invert AuthorizeReturnObjectMethodInterceptor Dependency
Closes gh-16922
1 parent 1ca33ca commit 5841e35

File tree

3 files changed

+41
-16
lines changed

3 files changed

+41
-16
lines changed

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

+7-8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.security.config.annotation.method.configuration;
1818

1919
import java.util.ArrayList;
20+
import java.util.List;
2021

2122
import org.aopalliance.intercept.MethodInterceptor;
2223

@@ -40,21 +41,19 @@ final class AuthorizationProxyConfiguration implements AopInfrastructureBean {
4041
@Bean
4142
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
4243
static AuthorizationAdvisorProxyFactory authorizationProxyFactory(
44+
ObjectProvider<AuthorizationAdvisor> authorizationAdvisors,
4345
ObjectProvider<Customizer<AuthorizationAdvisorProxyFactory>> customizers) {
44-
AuthorizationAdvisorProxyFactory factory = new AuthorizationAdvisorProxyFactory(new ArrayList<>());
46+
List<AuthorizationAdvisor> advisors = new ArrayList<>();
47+
authorizationAdvisors.forEach(advisors::add);
48+
AuthorizationAdvisorProxyFactory factory = new AuthorizationAdvisorProxyFactory(advisors);
4549
customizers.forEach((c) -> c.customize(factory));
4650
return factory;
4751
}
4852

4953
@Bean
5054
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
51-
static MethodInterceptor authorizeReturnObjectMethodInterceptor(ObjectProvider<AuthorizationAdvisor> provider,
52-
AuthorizationAdvisorProxyFactory authorizationProxyFactory) {
53-
provider.forEach(authorizationProxyFactory::addAdvisor);
54-
AuthorizeReturnObjectMethodInterceptor interceptor = new AuthorizeReturnObjectMethodInterceptor(
55-
authorizationProxyFactory);
56-
authorizationProxyFactory.addAdvisor(interceptor);
57-
return interceptor;
55+
static MethodInterceptor authorizeReturnObjectMethodInterceptor() {
56+
return new AuthorizeReturnObjectMethodInterceptor();
5857
}
5958

6059
@Bean

core/src/main/java/org/springframework/security/authorization/method/AuthorizationAdvisorProxyFactory.java

+9-7
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,16 @@ public final class AuthorizationAdvisorProxyFactory implements AuthorizationProx
100100

101101
/**
102102
* Construct an {@link AuthorizationAdvisorProxyFactory} with the provided advisors.
103-
*
104-
* <p>
105-
* The list may be empty, in the case where advisors are added later using
106-
* {@link #addAdvisor}.
107103
* @param advisors the advisors to use
108104
* @since 6.4
109105
*/
110106
public AuthorizationAdvisorProxyFactory(List<AuthorizationAdvisor> advisors) {
111107
this.advisors = new ArrayList<>(advisors);
112-
AnnotationAwareOrderComparator.sort(this.advisors);
108+
for (AuthorizationAdvisor advisor : this.advisors) {
109+
if (advisor instanceof AuthorizeReturnObjectMethodInterceptor interceptor) {
110+
interceptor.setAuthorizationProxyFactory(this);
111+
}
112+
}
113113
}
114114

115115
/**
@@ -124,8 +124,8 @@ public static AuthorizationAdvisorProxyFactory withDefaults() {
124124
advisors.add(AuthorizationManagerAfterMethodInterceptor.postAuthorize());
125125
advisors.add(new PreFilterAuthorizationMethodInterceptor());
126126
advisors.add(new PostFilterAuthorizationMethodInterceptor());
127+
advisors.add(new AuthorizeReturnObjectMethodInterceptor());
127128
AuthorizationAdvisorProxyFactory proxyFactory = new AuthorizationAdvisorProxyFactory(advisors);
128-
proxyFactory.addAdvisor(new AuthorizeReturnObjectMethodInterceptor(proxyFactory));
129129
AnnotationAwareOrderComparator.sort(proxyFactory.advisors);
130130
return proxyFactory;
131131
}
@@ -142,8 +142,8 @@ public static AuthorizationAdvisorProxyFactory withReactiveDefaults() {
142142
advisors.add(AuthorizationManagerAfterReactiveMethodInterceptor.postAuthorize());
143143
advisors.add(new PreFilterAuthorizationReactiveMethodInterceptor());
144144
advisors.add(new PostFilterAuthorizationReactiveMethodInterceptor());
145+
advisors.add(new AuthorizeReturnObjectMethodInterceptor());
145146
AuthorizationAdvisorProxyFactory proxyFactory = new AuthorizationAdvisorProxyFactory(advisors);
146-
proxyFactory.addAdvisor(new AuthorizeReturnObjectMethodInterceptor(proxyFactory));
147147
AnnotationAwareOrderComparator.sort(proxyFactory.advisors);
148148
return proxyFactory;
149149
}
@@ -230,7 +230,9 @@ public void setAdvisors(Collection<AuthorizationAdvisor> advisors) {
230230
* them.
231231
* @param advisor
232232
* @since 6.4
233+
* @deprecated please provide all advisors in the constructor
233234
*/
235+
@Deprecated
234236
public void addAdvisor(AuthorizationAdvisor advisor) {
235237
this.advisors.add(advisor);
236238
}

core/src/main/java/org/springframework/security/authorization/method/AuthorizeReturnObjectMethodInterceptor.java

+25-1
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,27 @@
3939
*/
4040
public final class AuthorizeReturnObjectMethodInterceptor implements AuthorizationAdvisor {
4141

42-
private final AuthorizationProxyFactory authorizationProxyFactory;
42+
private AuthorizationProxyFactory authorizationProxyFactory;
4343

4444
private Pointcut pointcut = Pointcuts.intersection(
4545
new MethodReturnTypePointcut(Predicate.not(ClassUtils::isVoidType)),
4646
AuthorizationMethodPointcuts.forAnnotations(AuthorizeReturnObject.class));
4747

4848
private int order = AuthorizationInterceptorsOrder.SECURE_RESULT.getOrder();
4949

50+
/**
51+
* Construct the interceptor
52+
*
53+
* <p>
54+
* Using this constructor requires you to specify
55+
* {@link #setAuthorizationProxyFactory}
56+
* </p>
57+
* @since 6.5
58+
*/
59+
public AuthorizeReturnObjectMethodInterceptor() {
60+
61+
}
62+
5063
public AuthorizeReturnObjectMethodInterceptor(AuthorizationProxyFactory authorizationProxyFactory) {
5164
Assert.notNull(authorizationProxyFactory, "authorizationProxyFactory cannot be null");
5265
this.authorizationProxyFactory = authorizationProxyFactory;
@@ -58,9 +71,20 @@ public Object invoke(MethodInvocation mi) throws Throwable {
5871
if (result == null) {
5972
return null;
6073
}
74+
Assert.notNull(this.authorizationProxyFactory, "authorizationProxyFactory cannot be null");
6175
return this.authorizationProxyFactory.proxy(result);
6276
}
6377

78+
/**
79+
* Use this {@link AuthorizationProxyFactory}
80+
* @param authorizationProxyFactory the proxy factory to use
81+
* @since 6.5
82+
*/
83+
public void setAuthorizationProxyFactory(AuthorizationProxyFactory authorizationProxyFactory) {
84+
Assert.notNull(authorizationProxyFactory, "authorizationProxyFactory cannot be null");
85+
this.authorizationProxyFactory = authorizationProxyFactory;
86+
}
87+
6488
@Override
6589
public int getOrder() {
6690
return this.order;

0 commit comments

Comments
 (0)