Skip to content

Commit 776c8d6

Browse files
committed
Add Supplier Support
Issue gh-14597
1 parent c622edc commit 776c8d6

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

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

+9-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.SortedSet;
3535
import java.util.TreeMap;
3636
import java.util.TreeSet;
37+
import java.util.function.Supplier;
3738
import java.util.stream.Stream;
3839

3940
import reactor.core.publisher.Flux;
@@ -91,7 +92,7 @@ public final class AuthorizationAdvisorProxyFactory
9192
/**
9293
* The default {@link TargetVisitor}, which will proxy {@link Class} instances as well
9394
* as instances contained in reactive types (if reactor is present), collection types,
94-
* and other container types like {@link Optional}
95+
* and other container types like {@link Optional} and {@link Supplier}
9596
*/
9697
public static final TargetVisitor DEFAULT_VISITOR = isReactivePresent
9798
? new DelegateVisitor(new ClassVisitor(), new ReactiveTypeVisitor(), new ContainerTypeVisitor())
@@ -330,6 +331,9 @@ public Object visit(AuthorizationAdvisorProxyFactory proxyFactory, Object target
330331
if (target instanceof Optional<?> optional) {
331332
return proxyOptional(proxyFactory, optional);
332333
}
334+
if (target instanceof Supplier<?> supplier) {
335+
return proxySupplier(proxyFactory, supplier);
336+
}
333337
return null;
334338
}
335339

@@ -462,6 +466,10 @@ private Optional<?> proxyOptional(AuthorizationProxyFactory proxyFactory, Option
462466
return optional.map(proxyFactory::proxy);
463467
}
464468

469+
private Supplier<?> proxySupplier(AuthorizationProxyFactory proxyFactory, Supplier<?> supplier) {
470+
return () -> proxyFactory.proxy(supplier.get());
471+
}
472+
465473
}
466474

467475
private static class ReactiveTypeVisitor implements TargetVisitor {

core/src/test/java/org/springframework/security/authorization/AuthorizationAdvisorProxyFactoryTests.java

+12
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.SortedSet;
3232
import java.util.TreeMap;
3333
import java.util.TreeSet;
34+
import java.util.function.Supplier;
3435
import java.util.stream.Stream;
3536

3637
import org.jetbrains.annotations.NotNull;
@@ -242,6 +243,17 @@ public void proxyWhenPreAuthorizeForOptionalThenHonors() {
242243
SecurityContextHolder.clearContext();
243244
}
244245

246+
@Test
247+
public void proxyWhenPreAuthorizeForSupplierThenHonors() {
248+
SecurityContextHolder.getContext().setAuthentication(this.user);
249+
AuthorizationAdvisorProxyFactory factory = AuthorizationAdvisorProxyFactory.withDefaults();
250+
Supplier<Flight> flights = () -> this.flight;
251+
assertThat(flights.get().getAltitude()).isEqualTo(35000d);
252+
Supplier<Flight> secured = proxy(factory, flights);
253+
assertThatExceptionOfType(AccessDeniedException.class).isThrownBy(() -> secured.get().getAltitude());
254+
SecurityContextHolder.clearContext();
255+
}
256+
245257
@Test
246258
public void proxyWhenPreAuthorizeForStreamThenHonors() {
247259
SecurityContextHolder.getContext().setAuthentication(this.user);

0 commit comments

Comments
 (0)