Skip to content

Commit 933ef67

Browse files
committed
Polish AuthorizationDeniedException Handling
Issue gh-14600
1 parent b1b84f9 commit 933ef67

9 files changed

+18
-91
lines changed

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
* @author Marcus da Coregio
2626
* @since 6.3
2727
*/
28-
public class AuthorizationDeniedException extends AccessDeniedException {
28+
public class AuthorizationDeniedException extends AccessDeniedException implements AuthorizationResult {
2929

3030
private final AuthorizationResult result;
3131

@@ -40,4 +40,9 @@ public AuthorizationResult getAuthorizationResult() {
4040
return this.result;
4141
}
4242

43+
@Override
44+
public boolean isGranted() {
45+
return false;
46+
}
47+
4348
}

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

+2-8
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.security.authorization.AuthorizationDeniedException;
3434
import org.springframework.security.authorization.AuthorizationEventPublisher;
3535
import org.springframework.security.authorization.AuthorizationManager;
36+
import org.springframework.security.authorization.AuthorizationResult;
3637
import org.springframework.security.core.Authentication;
3738
import org.springframework.security.core.context.SecurityContextHolder;
3839
import org.springframework.security.core.context.SecurityContextHolderStrategy;
@@ -190,14 +191,7 @@ private Object attemptAuthorization(MethodInvocation mi, Object result) {
190191
return result;
191192
}
192193

193-
private Object postProcess(MethodInvocationResult mi, AuthorizationDeniedException denied) {
194-
if (this.authorizationManager instanceof MethodAuthorizationDeniedPostProcessor postProcessableDecision) {
195-
return postProcessableDecision.postProcessResult(mi, denied);
196-
}
197-
return this.defaultPostProcessor.postProcessResult(mi, denied);
198-
}
199-
200-
private Object postProcess(MethodInvocationResult mi, AuthorizationDecision decision) {
194+
private Object postProcess(MethodInvocationResult mi, AuthorizationResult decision) {
201195
if (this.authorizationManager instanceof MethodAuthorizationDeniedPostProcessor postProcessableDecision) {
202196
return postProcessableDecision.postProcessResult(mi, decision);
203197
}

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

+2-16
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springframework.security.access.prepost.PostAuthorize;
3636
import org.springframework.security.authorization.AuthorizationDecision;
3737
import org.springframework.security.authorization.AuthorizationDeniedException;
38+
import org.springframework.security.authorization.AuthorizationResult;
3839
import org.springframework.security.authorization.ReactiveAuthorizationManager;
3940
import org.springframework.security.core.Authentication;
4041
import org.springframework.util.Assert;
@@ -165,22 +166,7 @@ private Mono<Object> postAuthorize(Mono<Authentication> authentication, MethodIn
165166
});
166167
}
167168

168-
private Mono<Object> postProcess(AuthorizationDeniedException denied,
169-
MethodInvocationResult methodInvocationResult) {
170-
return Mono.fromSupplier(() -> {
171-
if (this.authorizationManager instanceof MethodAuthorizationDeniedPostProcessor postProcessableDecision) {
172-
return postProcessableDecision.postProcessResult(methodInvocationResult, denied);
173-
}
174-
return this.defaultPostProcessor.postProcessResult(methodInvocationResult, denied);
175-
}).flatMap((processedResult) -> {
176-
if (Mono.class.isAssignableFrom(processedResult.getClass())) {
177-
return (Mono<?>) processedResult;
178-
}
179-
return Mono.justOrEmpty(processedResult);
180-
});
181-
}
182-
183-
private Mono<Object> postProcess(AuthorizationDecision decision, MethodInvocationResult methodInvocationResult) {
169+
private Mono<Object> postProcess(AuthorizationResult decision, MethodInvocationResult methodInvocationResult) {
184170
if (decision.isGranted()) {
185171
return Mono.just(methodInvocationResult.getResult());
186172
}

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

-7
Original file line numberDiff line numberDiff line change
@@ -264,13 +264,6 @@ private Object attemptAuthorization(MethodInvocation mi) throws Throwable {
264264
return mi.proceed();
265265
}
266266

267-
private Object handle(MethodInvocation mi, AuthorizationDeniedException denied) {
268-
if (this.authorizationManager instanceof MethodAuthorizationDeniedHandler handler) {
269-
return handler.handle(mi, denied);
270-
}
271-
return this.defaultHandler.handle(mi, denied);
272-
}
273-
274267
private Object handle(MethodInvocation mi, AuthorizationResult decision) {
275268
if (this.authorizationManager instanceof MethodAuthorizationDeniedHandler handler) {
276269
return handler.handle(mi, decision);

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

+2-15
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.security.access.prepost.PreAuthorize;
3535
import org.springframework.security.authorization.AuthorizationDecision;
3636
import org.springframework.security.authorization.AuthorizationDeniedException;
37+
import org.springframework.security.authorization.AuthorizationResult;
3738
import org.springframework.security.authorization.ReactiveAuthorizationManager;
3839
import org.springframework.security.core.Authentication;
3940
import org.springframework.util.Assert;
@@ -177,21 +178,7 @@ private Mono<Object> preAuthorized(MethodInvocation mi, Mono<Object> mapping) {
177178
});
178179
}
179180

180-
private Mono<Object> postProcess(AuthorizationDeniedException denied, MethodInvocation mi) {
181-
return Mono.fromSupplier(() -> {
182-
if (this.authorizationManager instanceof MethodAuthorizationDeniedHandler handler) {
183-
return handler.handle(mi, denied);
184-
}
185-
return this.defaultHandler.handle(mi, denied);
186-
}).flatMap((processedResult) -> {
187-
if (Mono.class.isAssignableFrom(processedResult.getClass())) {
188-
return (Mono<?>) processedResult;
189-
}
190-
return Mono.justOrEmpty(processedResult);
191-
});
192-
}
193-
194-
private Mono<Object> postProcess(AuthorizationDecision decision, MethodInvocation mi) {
181+
private Mono<Object> postProcess(AuthorizationResult decision, MethodInvocation mi) {
195182
return Mono.fromSupplier(() -> {
196183
if (this.authorizationManager instanceof MethodAuthorizationDeniedHandler handler) {
197184
return handler.handle(mi, decision);

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

-15
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import org.aopalliance.intercept.MethodInvocation;
2020

2121
import org.springframework.lang.Nullable;
22-
import org.springframework.security.authorization.AuthorizationDeniedException;
2322
import org.springframework.security.authorization.AuthorizationResult;
2423

2524
/**
@@ -44,18 +43,4 @@ public interface MethodAuthorizationDeniedHandler {
4443
@Nullable
4544
Object handle(MethodInvocation methodInvocation, AuthorizationResult authorizationResult);
4645

47-
/**
48-
* Handle denied method invocations, implementations might either throw an
49-
* {@link org.springframework.security.access.AccessDeniedException} or a replacement
50-
* result instead of invoking the method, e.g. a masked value.
51-
* @param methodInvocation the {@link MethodInvocation} related to the authorization
52-
* denied
53-
* @param authorizationDenied the authorization denied exception
54-
* @return a replacement result for the denied method invocation, or null, or a
55-
* {@link reactor.core.publisher.Mono} for reactive applications
56-
*/
57-
default Object handle(MethodInvocation methodInvocation, AuthorizationDeniedException authorizationDenied) {
58-
return handle(methodInvocation, authorizationDenied.getAuthorizationResult());
59-
}
60-
6146
}

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

-18
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.security.authorization.method;
1818

1919
import org.springframework.lang.Nullable;
20-
import org.springframework.security.authorization.AuthorizationDeniedException;
2120
import org.springframework.security.authorization.AuthorizationResult;
2221

2322
/**
@@ -44,21 +43,4 @@ public interface MethodAuthorizationDeniedPostProcessor {
4443
@Nullable
4544
Object postProcessResult(MethodInvocationResult methodInvocationResult, AuthorizationResult authorizationResult);
4645

47-
/**
48-
* Post-process the denied result produced by a method invocation, implementations
49-
* might either throw an
50-
* {@link org.springframework.security.access.AccessDeniedException} or return a
51-
* replacement result instead of the denied result, e.g. a masked value.
52-
* @param methodInvocationResult the object containing the method invocation and the
53-
* result produced
54-
* @param authorizationDenied the {@link AuthorizationDeniedException} containing the
55-
* authorization denied details
56-
* @return a replacement result for the denied result, or null, or a
57-
* {@link reactor.core.publisher.Mono} for reactive applications
58-
*/
59-
default Object postProcessResult(MethodInvocationResult methodInvocationResult,
60-
AuthorizationDeniedException authorizationDenied) {
61-
return postProcessResult(methodInvocationResult, authorizationDenied.getAuthorizationResult());
62-
}
63-
6446
}

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

+3-5
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,10 @@ public final class ThrowingMethodAuthorizationDeniedHandler implements MethodAut
3232

3333
@Override
3434
public Object handle(MethodInvocation methodInvocation, AuthorizationResult result) {
35+
if (result instanceof AuthorizationDeniedException denied) {
36+
throw denied;
37+
}
3538
throw new AuthorizationDeniedException("Access Denied", result);
3639
}
3740

38-
@Override
39-
public Object handle(MethodInvocation methodInvocation, AuthorizationDeniedException authorizationDenied) {
40-
throw authorizationDenied;
41-
}
42-
4341
}

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

+3-6
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,10 @@ public final class ThrowingMethodAuthorizationDeniedPostProcessor implements Met
3030

3131
@Override
3232
public Object postProcessResult(MethodInvocationResult methodInvocationResult, AuthorizationResult result) {
33+
if (result instanceof AuthorizationDeniedException denied) {
34+
throw denied;
35+
}
3336
throw new AuthorizationDeniedException("Access Denied", result);
3437
}
3538

36-
@Override
37-
public Object postProcessResult(MethodInvocationResult methodInvocationResult,
38-
AuthorizationDeniedException authorizationDenied) {
39-
throw authorizationDenied;
40-
}
41-
4239
}

0 commit comments

Comments
 (0)