Skip to content

Commit bbd31f0

Browse files
committed
Defer ObservationRegistry Lookup
Closes gh-12780
1 parent 7d22e02 commit bbd31f0

File tree

2 files changed

+53
-7
lines changed

2 files changed

+53
-7
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright 2002-2023 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.security.config.annotation.method.configuration;
18+
19+
import java.util.function.Supplier;
20+
21+
import io.micrometer.observation.ObservationRegistry;
22+
import reactor.core.publisher.Mono;
23+
24+
import org.springframework.beans.factory.ObjectProvider;
25+
import org.springframework.security.authorization.AuthorizationDecision;
26+
import org.springframework.security.authorization.ObservationReactiveAuthorizationManager;
27+
import org.springframework.security.authorization.ReactiveAuthorizationManager;
28+
import org.springframework.security.core.Authentication;
29+
import org.springframework.util.function.SingletonSupplier;
30+
31+
final class DeferringObservationReactiveAuthorizationManager<T> implements ReactiveAuthorizationManager<T> {
32+
33+
private final Supplier<ReactiveAuthorizationManager<T>> delegate;
34+
35+
DeferringObservationReactiveAuthorizationManager(ObjectProvider<ObservationRegistry> provider,
36+
ReactiveAuthorizationManager<T> delegate) {
37+
this.delegate = SingletonSupplier.of(() -> {
38+
ObservationRegistry registry = provider.getIfAvailable(() -> ObservationRegistry.NOOP);
39+
if (registry.isNoop()) {
40+
return delegate;
41+
}
42+
return new ObservationReactiveAuthorizationManager<>(registry, delegate);
43+
});
44+
}
45+
46+
@Override
47+
public Mono<AuthorizationDecision> check(Mono<Authentication> authentication, T object) {
48+
return this.delegate.get().check(authentication, object);
49+
}
50+
51+
}

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2023 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -28,7 +28,6 @@
2828
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
2929
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
3030
import org.springframework.security.authentication.ReactiveAuthenticationManager;
31-
import org.springframework.security.authorization.ObservationReactiveAuthorizationManager;
3231
import org.springframework.security.authorization.ReactiveAuthorizationManager;
3332
import org.springframework.security.authorization.method.AuthorizationManagerAfterReactiveMethodInterceptor;
3433
import org.springframework.security.authorization.method.AuthorizationManagerBeforeReactiveMethodInterceptor;
@@ -93,11 +92,7 @@ static DefaultMethodSecurityExpressionHandler methodSecurityExpressionHandler(
9392

9493
static <T> ReactiveAuthorizationManager<T> manager(ReactiveAuthorizationManager<T> delegate,
9594
ObjectProvider<ObservationRegistry> registryProvider) {
96-
ObservationRegistry registry = registryProvider.getIfAvailable(() -> ObservationRegistry.NOOP);
97-
if (registry.isNoop()) {
98-
return delegate;
99-
}
100-
return new ObservationReactiveAuthorizationManager<>(registry, delegate);
95+
return new DeferringObservationReactiveAuthorizationManager<>(registryProvider, delegate);
10196
}
10297

10398
}

0 commit comments

Comments
 (0)