Skip to content

Commit 8088f3e

Browse files
committed
Add Value-Type Ignore Support
Issue gh-14597
1 parent ce54a6d commit 8088f3e

File tree

9 files changed

+429
-321
lines changed

9 files changed

+429
-321
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,19 @@
3030
import org.springframework.security.authorization.AuthorizationAdvisorProxyFactory;
3131
import org.springframework.security.authorization.method.AuthorizationAdvisor;
3232
import org.springframework.security.authorization.method.AuthorizeReturnObjectMethodInterceptor;
33+
import org.springframework.security.config.Customizer;
3334

3435
@Configuration(proxyBeanMethods = false)
3536
final class AuthorizationProxyConfiguration implements AopInfrastructureBean {
3637

3738
@Bean
3839
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
39-
static AuthorizationAdvisorProxyFactory authorizationProxyFactory(ObjectProvider<AuthorizationAdvisor> provider) {
40+
static AuthorizationAdvisorProxyFactory authorizationProxyFactory(ObjectProvider<AuthorizationAdvisor> provider,
41+
ObjectProvider<Customizer<AuthorizationAdvisorProxyFactory>> customizers) {
4042
List<AuthorizationAdvisor> advisors = new ArrayList<>();
4143
provider.forEach(advisors::add);
42-
AuthorizationAdvisorProxyFactory factory = new AuthorizationAdvisorProxyFactory();
44+
AuthorizationAdvisorProxyFactory factory = AuthorizationAdvisorProxyFactory.withDefaults();
45+
customizers.forEach((c) -> c.customize(factory));
4346
factory.setAdvisors(advisors);
4447
return factory;
4548
}

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,30 @@
2727
import org.springframework.context.annotation.Bean;
2828
import org.springframework.context.annotation.Configuration;
2929
import org.springframework.context.annotation.Role;
30-
import org.springframework.security.authorization.ReactiveAuthorizationAdvisorProxyFactory;
30+
import org.springframework.security.authorization.AuthorizationAdvisorProxyFactory;
3131
import org.springframework.security.authorization.method.AuthorizationAdvisor;
3232
import org.springframework.security.authorization.method.AuthorizeReturnObjectMethodInterceptor;
33+
import org.springframework.security.config.Customizer;
3334

3435
@Configuration(proxyBeanMethods = false)
3536
final class ReactiveAuthorizationProxyConfiguration implements AopInfrastructureBean {
3637

3738
@Bean
3839
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
39-
static ReactiveAuthorizationAdvisorProxyFactory authorizationProxyFactory(
40-
ObjectProvider<AuthorizationAdvisor> provider) {
40+
static AuthorizationAdvisorProxyFactory authorizationProxyFactory(ObjectProvider<AuthorizationAdvisor> provider,
41+
ObjectProvider<Customizer<AuthorizationAdvisorProxyFactory>> customizers) {
4142
List<AuthorizationAdvisor> advisors = new ArrayList<>();
4243
provider.forEach(advisors::add);
43-
ReactiveAuthorizationAdvisorProxyFactory factory = new ReactiveAuthorizationAdvisorProxyFactory();
44+
AuthorizationAdvisorProxyFactory factory = AuthorizationAdvisorProxyFactory.withReactiveDefaults();
45+
customizers.forEach((c) -> c.customize(factory));
4446
factory.setAdvisors(advisors);
4547
return factory;
4648
}
4749

4850
@Bean
4951
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
5052
static MethodInterceptor authorizeReturnObjectMethodInterceptor(ObjectProvider<AuthorizationAdvisor> provider,
51-
ReactiveAuthorizationAdvisorProxyFactory authorizationProxyFactory) {
53+
AuthorizationAdvisorProxyFactory authorizationProxyFactory) {
5254
AuthorizeReturnObjectMethodInterceptor interceptor = new AuthorizeReturnObjectMethodInterceptor(
5355
authorizationProxyFactory);
5456
List<AuthorizationAdvisor> advisors = new ArrayList<>();

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import org.springframework.security.access.prepost.PostFilter;
5959
import org.springframework.security.access.prepost.PreAuthorize;
6060
import org.springframework.security.access.prepost.PreFilter;
61+
import org.springframework.security.authorization.AuthorizationAdvisorProxyFactory;
6162
import org.springframework.security.authorization.AuthorizationDecision;
6263
import org.springframework.security.authorization.AuthorizationEventPublisher;
6364
import org.springframework.security.authorization.AuthorizationManager;
@@ -66,6 +67,7 @@
6667
import org.springframework.security.authorization.method.AuthorizeReturnObject;
6768
import org.springframework.security.authorization.method.MethodInvocationResult;
6869
import org.springframework.security.authorization.method.PrePostTemplateDefaults;
70+
import org.springframework.security.config.Customizer;
6971
import org.springframework.security.config.annotation.SecurityContextChangedListenerConfig;
7072
import org.springframework.security.config.core.GrantedAuthorityDefaults;
7173
import org.springframework.security.config.test.SpringTestContext;
@@ -1143,6 +1145,12 @@ List<String> resultsContainDave(List<String> list) {
11431145
@Configuration
11441146
static class AuthorizeResultConfig {
11451147

1148+
@Bean
1149+
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
1150+
static Customizer<AuthorizationAdvisorProxyFactory> skipValueTypes() {
1151+
return (f) -> f.setTargetVisitor(AuthorizationAdvisorProxyFactory.DEFAULT_VISITOR_SKIP_VALUE_TYPES);
1152+
}
1153+
11461154
@Bean
11471155
FlightRepository flights() {
11481156
FlightRepository flights = new FlightRepository();
@@ -1186,6 +1194,7 @@ void remove(String id) {
11861194

11871195
}
11881196

1197+
@AuthorizeReturnObject
11891198
static class Flight {
11901199

11911200
private final String id;
@@ -1216,7 +1225,6 @@ Integer getSeats() {
12161225
return this.seats;
12171226
}
12181227

1219-
@AuthorizeReturnObject
12201228
@PostAuthorize("hasAuthority('seating:read')")
12211229
@PostFilter("filterObject.name != 'Kevin Mitnick'")
12221230
List<Passenger> getPassengers() {

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@
3030
import reactor.test.StepVerifier;
3131

3232
import org.springframework.beans.factory.annotation.Autowired;
33+
import org.springframework.beans.factory.config.BeanDefinition;
3334
import org.springframework.context.annotation.Bean;
3435
import org.springframework.context.annotation.Configuration;
36+
import org.springframework.context.annotation.Role;
3537
import org.springframework.expression.EvaluationContext;
3638
import org.springframework.security.access.AccessDeniedException;
3739
import org.springframework.security.access.expression.SecurityExpressionRoot;
@@ -42,7 +44,9 @@
4244
import org.springframework.security.access.prepost.PreAuthorize;
4345
import org.springframework.security.access.prepost.PreFilter;
4446
import org.springframework.security.authentication.TestAuthentication;
47+
import org.springframework.security.authorization.AuthorizationAdvisorProxyFactory;
4548
import org.springframework.security.authorization.method.AuthorizeReturnObject;
49+
import org.springframework.security.config.Customizer;
4650
import org.springframework.security.config.core.GrantedAuthorityDefaults;
4751
import org.springframework.security.config.test.SpringTestContext;
4852
import org.springframework.security.config.test.SpringTestContextExtension;
@@ -238,6 +242,13 @@ public void bar(String param) {
238242
@Configuration
239243
static class AuthorizeResultConfig {
240244

245+
@Bean
246+
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
247+
static Customizer<AuthorizationAdvisorProxyFactory> skipValueTypes() {
248+
return (factory) -> factory
249+
.setTargetVisitor(AuthorizationAdvisorProxyFactory.DEFAULT_VISITOR_SKIP_VALUE_TYPES);
250+
}
251+
241252
@Bean
242253
FlightRepository flights() {
243254
FlightRepository flights = new FlightRepository();
@@ -282,6 +293,7 @@ Mono<Void> remove(String id) {
282293

283294
}
284295

296+
@AuthorizeReturnObject
285297
static class Flight {
286298

287299
private final String id;
@@ -312,7 +324,6 @@ Mono<Integer> getSeats() {
312324
return Mono.just(this.seats);
313325
}
314326

315-
@AuthorizeReturnObject
316327
@PostAuthorize("hasAnyAuthority('seating:read', 'airplane:read')")
317328
@PostFilter("@isNotKevin.apply(filterObject)")
318329
Flux<Passenger> getPassengers() {

0 commit comments

Comments
 (0)