|
@@ -19,15 +19,16 @@ package org.springframework.security.authorization.method;
|
|
|
import org.aopalliance.intercept.MethodInvocation;
|
|
|
import org.assertj.core.api.InstanceOfAssertFactories;
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
-import org.mockito.invocation.InvocationOnMock;
|
|
|
import reactor.core.publisher.Flux;
|
|
|
import reactor.core.publisher.Mono;
|
|
|
|
|
|
import org.springframework.aop.Pointcut;
|
|
|
+import org.springframework.expression.common.LiteralExpression;
|
|
|
import org.springframework.security.access.AccessDeniedException;
|
|
|
import org.springframework.security.access.intercept.method.MockMethodInvocation;
|
|
|
import org.springframework.security.authorization.AuthorizationDecision;
|
|
|
import org.springframework.security.authorization.AuthorizationDeniedException;
|
|
|
+import org.springframework.security.authorization.AuthorizationResult;
|
|
|
import org.springframework.security.authorization.ReactiveAuthorizationManager;
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
@@ -124,10 +125,10 @@ public class AuthorizationManagerAfterReactiveMethodInterceptorTests {
|
|
|
MethodInvocation mockMethodInvocation = spy(
|
|
|
new MockMethodInvocation(new Sample(), Sample.class.getDeclaredMethod("flux")));
|
|
|
given(mockMethodInvocation.proceed()).willReturn(Flux.just("john", "bob"));
|
|
|
- HandlingReactiveAuthorizationManager mockReactiveAuthorizationManager = mock(
|
|
|
- HandlingReactiveAuthorizationManager.class);
|
|
|
- given(mockReactiveAuthorizationManager.postProcessResult(any(), any())).willAnswer(this::masking);
|
|
|
- given(mockReactiveAuthorizationManager.check(any(), any())).willReturn(Mono.empty());
|
|
|
+ ReactiveAuthorizationManager<MethodInvocationResult> mockReactiveAuthorizationManager = mock(
|
|
|
+ ReactiveAuthorizationManager.class);
|
|
|
+ given(mockReactiveAuthorizationManager.check(any(), any()))
|
|
|
+ .will((invocation) -> Mono.just(createDecision(new MaskingPostProcessor())));
|
|
|
AuthorizationManagerAfterReactiveMethodInterceptor interceptor = new AuthorizationManagerAfterReactiveMethodInterceptor(
|
|
|
Pointcut.TRUE, mockReactiveAuthorizationManager);
|
|
|
Object result = interceptor.invoke(mockMethodInvocation);
|
|
@@ -143,16 +144,15 @@ public class AuthorizationManagerAfterReactiveMethodInterceptorTests {
|
|
|
MethodInvocation mockMethodInvocation = spy(
|
|
|
new MockMethodInvocation(new Sample(), Sample.class.getDeclaredMethod("flux")));
|
|
|
given(mockMethodInvocation.proceed()).willReturn(Flux.just("john", "bob"));
|
|
|
- HandlingReactiveAuthorizationManager mockReactiveAuthorizationManager = mock(
|
|
|
- HandlingReactiveAuthorizationManager.class);
|
|
|
- given(mockReactiveAuthorizationManager.postProcessResult(any(), any())).willAnswer((invocation) -> {
|
|
|
- MethodInvocationResult argument = invocation.getArgument(0);
|
|
|
- if (!"john".equals(argument.getResult())) {
|
|
|
- return monoMasking(invocation);
|
|
|
+ ReactiveAuthorizationManager<MethodInvocationResult> mockReactiveAuthorizationManager = mock(
|
|
|
+ ReactiveAuthorizationManager.class);
|
|
|
+ given(mockReactiveAuthorizationManager.check(any(), any())).willAnswer((invocation) -> {
|
|
|
+ MethodInvocationResult argument = invocation.getArgument(1);
|
|
|
+ if ("john".equals(argument.getResult())) {
|
|
|
+ return Mono.just(new AuthorizationDecision(true));
|
|
|
}
|
|
|
- return Mono.just(argument.getResult());
|
|
|
+ return Mono.just(createDecision(new MaskingPostProcessor()));
|
|
|
});
|
|
|
- given(mockReactiveAuthorizationManager.check(any(), any())).willReturn(Mono.empty());
|
|
|
AuthorizationManagerAfterReactiveMethodInterceptor interceptor = new AuthorizationManagerAfterReactiveMethodInterceptor(
|
|
|
Pointcut.TRUE, mockReactiveAuthorizationManager);
|
|
|
Object result = interceptor.invoke(mockMethodInvocation);
|
|
@@ -168,10 +168,11 @@ public class AuthorizationManagerAfterReactiveMethodInterceptorTests {
|
|
|
MethodInvocation mockMethodInvocation = spy(
|
|
|
new MockMethodInvocation(new Sample(), Sample.class.getDeclaredMethod("mono")));
|
|
|
given(mockMethodInvocation.proceed()).willReturn(Mono.just("john"));
|
|
|
- HandlingReactiveAuthorizationManager mockReactiveAuthorizationManager = mock(
|
|
|
- HandlingReactiveAuthorizationManager.class);
|
|
|
- given(mockReactiveAuthorizationManager.postProcessResult(any(), any())).willAnswer(this::masking);
|
|
|
- given(mockReactiveAuthorizationManager.check(any(), any())).willReturn(Mono.empty());
|
|
|
+ ReactiveAuthorizationManager<MethodInvocationResult> mockReactiveAuthorizationManager = mock(
|
|
|
+ ReactiveAuthorizationManager.class);
|
|
|
+ PostAuthorizeAuthorizationDecision decision = new PostAuthorizeAuthorizationDecision(false,
|
|
|
+ new LiteralExpression("1234"), new MaskingPostProcessor());
|
|
|
+ given(mockReactiveAuthorizationManager.check(any(), any())).willReturn(Mono.just(decision));
|
|
|
AuthorizationManagerAfterReactiveMethodInterceptor interceptor = new AuthorizationManagerAfterReactiveMethodInterceptor(
|
|
|
Pointcut.TRUE, mockReactiveAuthorizationManager);
|
|
|
Object result = interceptor.invoke(mockMethodInvocation);
|
|
@@ -186,10 +187,11 @@ public class AuthorizationManagerAfterReactiveMethodInterceptorTests {
|
|
|
MethodInvocation mockMethodInvocation = spy(
|
|
|
new MockMethodInvocation(new Sample(), Sample.class.getDeclaredMethod("mono")));
|
|
|
given(mockMethodInvocation.proceed()).willReturn(Mono.just("john"));
|
|
|
- HandlingReactiveAuthorizationManager mockReactiveAuthorizationManager = mock(
|
|
|
- HandlingReactiveAuthorizationManager.class);
|
|
|
- given(mockReactiveAuthorizationManager.postProcessResult(any(), any())).willAnswer(this::monoMasking);
|
|
|
- given(mockReactiveAuthorizationManager.check(any(), any())).willReturn(Mono.empty());
|
|
|
+ ReactiveAuthorizationManager<MethodInvocationResult> mockReactiveAuthorizationManager = mock(
|
|
|
+ ReactiveAuthorizationManager.class);
|
|
|
+ PostAuthorizeAuthorizationDecision decision = new PostAuthorizeAuthorizationDecision(false,
|
|
|
+ new LiteralExpression("1234"), new MonoMaskingPostProcessor());
|
|
|
+ given(mockReactiveAuthorizationManager.check(any(), any())).willReturn(Mono.just(decision));
|
|
|
AuthorizationManagerAfterReactiveMethodInterceptor interceptor = new AuthorizationManagerAfterReactiveMethodInterceptor(
|
|
|
Pointcut.TRUE, mockReactiveAuthorizationManager);
|
|
|
Object result = interceptor.invoke(mockMethodInvocation);
|
|
@@ -204,10 +206,11 @@ public class AuthorizationManagerAfterReactiveMethodInterceptorTests {
|
|
|
MethodInvocation mockMethodInvocation = spy(
|
|
|
new MockMethodInvocation(new Sample(), Sample.class.getDeclaredMethod("mono")));
|
|
|
given(mockMethodInvocation.proceed()).willReturn(Mono.just("john"));
|
|
|
- HandlingReactiveAuthorizationManager mockReactiveAuthorizationManager = mock(
|
|
|
- HandlingReactiveAuthorizationManager.class);
|
|
|
- given(mockReactiveAuthorizationManager.postProcessResult(any(), any())).willReturn(null);
|
|
|
- given(mockReactiveAuthorizationManager.check(any(), any())).willReturn(Mono.empty());
|
|
|
+ ReactiveAuthorizationManager<MethodInvocationResult> mockReactiveAuthorizationManager = mock(
|
|
|
+ ReactiveAuthorizationManager.class);
|
|
|
+ PostAuthorizeAuthorizationDecision decision = new PostAuthorizeAuthorizationDecision(false,
|
|
|
+ new LiteralExpression("1234"), new NullPostProcessor());
|
|
|
+ given(mockReactiveAuthorizationManager.check(any(), any())).willReturn(Mono.just(decision));
|
|
|
AuthorizationManagerAfterReactiveMethodInterceptor interceptor = new AuthorizationManagerAfterReactiveMethodInterceptor(
|
|
|
Pointcut.TRUE, mockReactiveAuthorizationManager);
|
|
|
Object result = interceptor.invoke(mockMethodInvocation);
|
|
@@ -235,18 +238,34 @@ public class AuthorizationManagerAfterReactiveMethodInterceptorTests {
|
|
|
verify(mockReactiveAuthorizationManager).check(any(), any());
|
|
|
}
|
|
|
|
|
|
- private Object masking(InvocationOnMock invocation) {
|
|
|
- MethodInvocationResult result = invocation.getArgument(0);
|
|
|
- return result.getResult() + "-masked";
|
|
|
+ private PostAuthorizeAuthorizationDecision createDecision(MethodAuthorizationDeniedPostProcessor postProcessor) {
|
|
|
+ return new PostAuthorizeAuthorizationDecision(false, new LiteralExpression("1234"), postProcessor);
|
|
|
}
|
|
|
|
|
|
- private Object monoMasking(InvocationOnMock invocation) {
|
|
|
- MethodInvocationResult result = invocation.getArgument(0);
|
|
|
- return Mono.just(result.getResult() + "-masked");
|
|
|
+ static class MaskingPostProcessor implements MethodAuthorizationDeniedPostProcessor {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object postProcessResult(MethodInvocationResult contextObject, AuthorizationResult result) {
|
|
|
+ return contextObject.getResult() + "-masked";
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- interface HandlingReactiveAuthorizationManager
|
|
|
- extends ReactiveAuthorizationManager<MethodInvocationResult>, MethodAuthorizationDeniedPostProcessor {
|
|
|
+ static class MonoMaskingPostProcessor implements MethodAuthorizationDeniedPostProcessor {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object postProcessResult(MethodInvocationResult contextObject, AuthorizationResult result) {
|
|
|
+ return Mono.just(contextObject.getResult() + "-masked");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ static class NullPostProcessor implements MethodAuthorizationDeniedPostProcessor {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object postProcessResult(MethodInvocationResult contextObject, AuthorizationResult result) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|