Skip to content

Commit 68a1753

Browse files
committed
Add Value-Type Ignore Support
Issue spring-projectsgh-14597
1 parent ce54a6d commit 68a1753

File tree

9 files changed

+456
-328
lines changed

9 files changed

+456
-328
lines changed

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

+5-2
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

+7-5
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

+10-1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@
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;
62+
import org.springframework.security.authorization.AuthorizationAdvisorProxyFactory.TargetVisitor;
6163
import org.springframework.security.authorization.AuthorizationDecision;
6264
import org.springframework.security.authorization.AuthorizationEventPublisher;
6365
import org.springframework.security.authorization.AuthorizationManager;
@@ -66,6 +68,7 @@
6668
import org.springframework.security.authorization.method.AuthorizeReturnObject;
6769
import org.springframework.security.authorization.method.MethodInvocationResult;
6870
import org.springframework.security.authorization.method.PrePostTemplateDefaults;
71+
import org.springframework.security.config.Customizer;
6972
import org.springframework.security.config.annotation.SecurityContextChangedListenerConfig;
7073
import org.springframework.security.config.core.GrantedAuthorityDefaults;
7174
import org.springframework.security.config.test.SpringTestContext;
@@ -1143,6 +1146,12 @@ List<String> resultsContainDave(List<String> list) {
11431146
@Configuration
11441147
static class AuthorizeResultConfig {
11451148

1149+
@Bean
1150+
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
1151+
static Customizer<AuthorizationAdvisorProxyFactory> skipValueTypes() {
1152+
return (f) -> f.setTargetVisitor(TargetVisitor.defaultsSkipValueTypes());
1153+
}
1154+
11461155
@Bean
11471156
FlightRepository flights() {
11481157
FlightRepository flights = new FlightRepository();
@@ -1186,6 +1195,7 @@ void remove(String id) {
11861195

11871196
}
11881197

1198+
@AuthorizeReturnObject
11891199
static class Flight {
11901200

11911201
private final String id;
@@ -1216,7 +1226,6 @@ Integer getSeats() {
12161226
return this.seats;
12171227
}
12181228

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

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

+12-1
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,10 @@
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;
48+
import org.springframework.security.authorization.AuthorizationAdvisorProxyFactory.TargetVisitor;
4549
import org.springframework.security.authorization.method.AuthorizeReturnObject;
50+
import org.springframework.security.config.Customizer;
4651
import org.springframework.security.config.core.GrantedAuthorityDefaults;
4752
import org.springframework.security.config.test.SpringTestContext;
4853
import org.springframework.security.config.test.SpringTestContextExtension;
@@ -238,6 +243,12 @@ public void bar(String param) {
238243
@Configuration
239244
static class AuthorizeResultConfig {
240245

246+
@Bean
247+
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
248+
static Customizer<AuthorizationAdvisorProxyFactory> skipValueTypes() {
249+
return (factory) -> factory.setTargetVisitor(TargetVisitor.defaultsSkipValueTypes());
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)