diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/AuthenticationPrincipalArgumentResolverTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/AuthenticationPrincipalArgumentResolverTests.java index 0aac0ad8..0a3703cb 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/AuthenticationPrincipalArgumentResolverTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/AuthenticationPrincipalArgumentResolverTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +30,6 @@ import reactor.util.context.Context; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.MethodParameter; -import org.springframework.core.ResolvableType; import org.springframework.core.annotation.SynthesizingMethodParameter; import org.springframework.graphql.data.method.annotation.Argument; import org.springframework.graphql.data.method.annotation.QueryMapping; @@ -54,26 +53,10 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; * Tests for {@link AuthenticationPrincipalArgumentResolver}. * * @author Rob Winch + * @author Rossen Stoyanchev */ class AuthenticationPrincipalArgumentResolverTests { - private static final Class STRING_CLASS = String.class; - - private static final Class USER_DETAILS_CLASS = UserDetails.class; - - private static final Class MONO_USER_DETAILS_CLASS = - ResolvableType.forClassWithGenerics(Mono.class, UserDetails.class).getRawClass(); - - private static final Class MONO_STRING_CLASS = - ResolvableType.forClassWithGenerics(Mono.class, String.class).getRawClass(); - - private static final Class PUBLISHER_USER_DETAILS_CLASS = - ResolvableType.forClassWithGenerics(Publisher.class, UserDetails.class).getRawClass(); - - private static final Class TESTPUBLISHER_USER_DETAILS_CLASS = - ResolvableType.forClassWithGenerics(TestPublisher.class, UserDetails.class).getRawClass(); - - private final AuthenticationPrincipalArgumentResolver resolver = new AuthenticationPrincipalArgumentResolver((beanName, context) -> new PrincipalConverter()); @@ -83,48 +66,49 @@ class AuthenticationPrincipalArgumentResolverTests { SecurityContextHolder.clearContext(); } + @Test void supportsParameterWhenNoAnnotation() { - MethodParameter parameter = firstParameter(UserController.class, "noParameter", USER_DETAILS_CLASS); + MethodParameter parameter = firstParameter(UserController.class, "noParameter", UserDetails.class); assertThat(this.resolver.supportsParameter(parameter)).isFalse(); } @Test void supportsParameterWhenWrongAnnotation() { - MethodParameter parameter = firstParameter(UserController.class, "argument", USER_DETAILS_CLASS); + MethodParameter parameter = firstParameter(UserController.class, "argument", UserDetails.class); assertThat(this.resolver.supportsParameter(parameter)).isFalse(); } @Test void supportsParameterWhenCurrentUser() { - MethodParameter parameter = firstParameter(UserController.class, "currentUser", USER_DETAILS_CLASS); + MethodParameter parameter = firstParameter(UserController.class, "currentUser", UserDetails.class); assertThat(this.resolver.supportsParameter(parameter)).isTrue(); } @Test void supportsParameterWhenAuthenticationPrincipal() { - MethodParameter parameter = firstParameter(UserController.class, "userDetails", USER_DETAILS_CLASS); + MethodParameter parameter = firstParameter(UserController.class, "userDetails", UserDetails.class); assertThat(this.resolver.supportsParameter(parameter)).isTrue(); } @Test void resolveArgumentWhenAuthenticationPrincipal() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "userDetails", USER_DETAILS_CLASS); - Mono details = (Mono) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "userDetails", UserDetails.class); + Mono details = resolveArgument(parameter); assertThat(details.contextWrite(authenticationContext()).block().getUsername()).isEqualTo("user"); } @Test void resolveArgumentWhenCurrentUser() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "currentUser", USER_DETAILS_CLASS); - Mono details = (Mono) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "currentUser", UserDetails.class); + Mono details = resolveArgument(parameter); assertThat(details.contextWrite(authenticationContext()).block().getUsername()).isEqualTo("user"); } @Test void resolveArgumentWhenNoSecurityContext() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "currentUser", USER_DETAILS_CLASS); - Mono details = (Mono) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "currentUser", UserDetails.class); + Mono details = resolveArgument(parameter); assertThat(details.block()).isNull(); } @@ -133,82 +117,82 @@ class AuthenticationPrincipalArgumentResolverTests { SecurityContext context = SecurityContextHolder.createEmptyContext(); context.setAuthentication(usernamePasswordAuthentication()); SecurityContextHolder.setContext(context); - MethodParameter parameter = firstParameter(UserController.class, "currentUser", USER_DETAILS_CLASS); - Mono details = (Mono) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "currentUser", UserDetails.class); + Mono details = resolveArgument(parameter); assertThat(details.contextWrite(authenticationContext()).block().getUsername()).isEqualTo("user"); } @Test void resolveArgumentWhenAuthenticationPrincipalUsername() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "username", STRING_CLASS); - Mono details = (Mono) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "username", String.class); + Mono details = resolveArgument(parameter); assertThat(details.contextWrite(authenticationContext()).block()).isEqualTo("user"); } @Test void resolveArgumentWhenBeanName() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "beanName", USER_DETAILS_CLASS); - Mono details = (Mono) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "beanName", UserDetails.class); + Mono details = resolveArgument(parameter); assertThat(details.contextWrite(authenticationContext()).block().getUsername()).isEqualTo("user"); } @Test void resolveArgumentWhenErrorOnInvalidType() throws Exception { MethodParameter parameter = firstParameter(UserController.class, "errorOnInvalidType", String.class); - Mono details = (Mono) this.resolver.resolveArgument(parameter, null); + Mono details = resolveArgument(parameter); assertThatExceptionOfType(ClassCastException.class) .isThrownBy(() -> details.contextWrite(authenticationContext()).block()); } @Test void resolveArgumentWhenInvalidType() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "invalidType", STRING_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "invalidType", String.class); + Mono> details = resolveArgument(parameter); assertThat(details.flatMap(u -> u).contextWrite(authenticationContext()).block()).isNull(); } @Test void supportsParameterWhenMonoNoAnnotation() { - MethodParameter parameter = firstParameter(UserController.class, "noParameter", MONO_USER_DETAILS_CLASS); + MethodParameter parameter = firstParameter(UserController.class, "noParameter", Mono.class); assertThat(this.resolver.supportsParameter(parameter)).isFalse(); } @Test void supportsParameterWhenMonoWrongAnnotation() { - MethodParameter parameter = firstParameter(UserController.class, "argument", MONO_USER_DETAILS_CLASS); + MethodParameter parameter = firstParameter(UserController.class, "argument", Mono.class); assertThat(this.resolver.supportsParameter(parameter)).isFalse(); } @Test void supportsParameterWhenMonoCurrentUser() { - MethodParameter parameter = firstParameter(UserController.class, "currentUser", MONO_USER_DETAILS_CLASS); + MethodParameter parameter = firstParameter(UserController.class, "currentUser", Mono.class); assertThat(this.resolver.supportsParameter(parameter)).isTrue(); } @Test void supportsParameterWhenMonoAuthenticationPrincipal() { - MethodParameter parameter = firstParameter(UserController.class, "userDetails", MONO_USER_DETAILS_CLASS); + MethodParameter parameter = firstParameter(UserController.class, "userDetails", Mono.class); assertThat(this.resolver.supportsParameter(parameter)).isTrue(); } @Test void resolveArgumentWhenMonoAuthenticationPrincipal() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "userDetails", MONO_USER_DETAILS_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "userDetails", Mono.class); + Mono> details = resolveArgument(parameter); assertThat(details.block().contextWrite(authenticationContext()).block().getUsername()).isEqualTo("user"); } @Test void resolveArgumentWhenMonoCurrentUser() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "currentUser", MONO_USER_DETAILS_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "currentUser", Mono.class); + Mono> details = resolveArgument(parameter); assertThat(details.block().contextWrite(authenticationContext()).block().getUsername()).isEqualTo("user"); } @Test void resolveArgumentWhenMonoNoSecurityContext() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "currentUser", MONO_USER_DETAILS_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "currentUser", Mono.class); + Mono> details = resolveArgument(parameter); assertThat(details.block().block()).isNull(); } @@ -217,58 +201,58 @@ class AuthenticationPrincipalArgumentResolverTests { SecurityContext context = SecurityContextHolder.createEmptyContext(); context.setAuthentication(usernamePasswordAuthentication()); SecurityContextHolder.setContext(context); - MethodParameter parameter = firstParameter(UserController.class, "currentUser", MONO_USER_DETAILS_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "currentUser", Mono.class); + Mono> details = resolveArgument(parameter); assertThat(details.block().contextWrite(authenticationContext()).block().getUsername()).isEqualTo("user"); } @Test void resolveArgumentWhenMonoAuthenticationPrincipalUsername() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "username", MONO_STRING_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "username", Mono.class); + Mono> details = resolveArgument(parameter); assertThat(details.block().contextWrite(authenticationContext()).block()).isEqualTo("user"); } @Test void resolveArgumentWhenMonoBeanName() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "beanName", MONO_USER_DETAILS_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "beanName", Mono.class); + Mono> details = resolveArgument(parameter); assertThat(details.flatMap(u -> u).contextWrite(authenticationContext()).block().getUsername()).isEqualTo("user"); } @Test void resolveArgumentWhenMonoErrorOnInvalidType() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "errorOnInvalidType", MONO_STRING_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "errorOnInvalidType", Mono.class); + Mono> details = resolveArgument(parameter); assertThatExceptionOfType(ClassCastException.class) .isThrownBy(() -> details.flatMap(u -> u).contextWrite(authenticationContext()).block()); } @Test void resolveArgumentWhenMonoInvalidType() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "invalidType", MONO_STRING_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "invalidType", Mono.class); + Mono> details = resolveArgument(parameter); assertThat(details.flatMap(u -> u).contextWrite(authenticationContext()).block()).isNull(); } @Test void resolveArgumentWhenPublisher() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "publisher", PUBLISHER_USER_DETAILS_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "publisher", Publisher.class); + Mono> details = resolveArgument(parameter); assertThat(details.block().contextWrite(authenticationContext()).block().getUsername()).isEqualTo("user"); } @Test void resolveArgumentWhenTestPublisherThenEmptyMono() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "publisher", TESTPUBLISHER_USER_DETAILS_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "publisher", TestPublisher.class); + Mono> details = resolveArgument(parameter); assertThat(details.contextWrite(authenticationContext()).block()).isNull(); } @Test void resolveArgumentWhenTestPublisherAndErrorOnInvalidType() throws Exception { - MethodParameter parameter = firstParameter(UserController.class, "errorOnInvalidType", TESTPUBLISHER_USER_DETAILS_CLASS); - Mono> details = (Mono>) this.resolver.resolveArgument(parameter, null); + MethodParameter parameter = firstParameter(UserController.class, "errorOnInvalidType", TestPublisher.class); + Mono> details = resolveArgument(parameter); assertThatExceptionOfType(ClassCastException.class) .isThrownBy(() -> details.flatMap(u -> u).contextWrite(authenticationContext()).block()); } @@ -284,6 +268,11 @@ class AuthenticationPrincipalArgumentResolverTests { return parameter; } + @SuppressWarnings({"unchecked", "DataFlowIssue"}) + private T resolveArgument(MethodParameter parameter) throws Exception { + return (T) this.resolver.resolveArgument(parameter, null); + } + private static Function authenticationContext() { return (context) -> ReactiveSecurityContextHolder.withAuthentication(usernamePasswordAuthentication()); } @@ -297,6 +286,7 @@ class AuthenticationPrincipalArgumentResolverTests { return new User("user", "password", AuthorityUtils.createAuthorityList("ROLE_USER")); } + static class PrincipalConverter { public UserDetails convert(UserDetails userDetails) { return userDetails;