1
0
mirror of synced 2026-08-04 09:17:02 +00:00

Support @ClientRegistrationId at Class Level

Closes gh-17806

Signed-off-by: Bernard Budano <bbudano@gmail.com>
This commit is contained in:
Bernard Budano
2025-09-03 10:49:28 +02:00
committed by Rob Winch
parent 35f41f87d1
commit 8e3cf9677c
3 changed files with 37 additions and 14 deletions
@@ -33,7 +33,7 @@ import org.springframework.core.annotation.AliasFor;
* @since 7.0
* @see org.springframework.security.oauth2.client.web.client.ClientRegistrationIdProcessor
*/
@Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ClientRegistrationId {
@@ -17,6 +17,7 @@
package org.springframework.security.oauth2.client.web.client;
import java.lang.reflect.Method;
import java.util.Optional;
import org.jspecify.annotations.Nullable;
@@ -37,17 +38,20 @@ public final class ClientRegistrationIdProcessor implements HttpRequestValues.Pr
public static ClientRegistrationIdProcessor DEFAULT_INSTANCE = new ClientRegistrationIdProcessor();
private ClientRegistrationIdProcessor() {
}
@Override
public void process(Method method, MethodParameter[] parameters, @Nullable Object[] arguments,
HttpRequestValues.Builder builder) {
ClientRegistrationId registeredId = AnnotationUtils.findAnnotation(method, ClientRegistrationId.class);
ClientRegistrationId registeredId = Optional
.ofNullable(AnnotationUtils.findAnnotation(method, ClientRegistrationId.class))
.orElseGet(() -> AnnotationUtils.findAnnotation(method.getDeclaringClass(), ClientRegistrationId.class));
if (registeredId != null) {
String registrationId = registeredId.registrationId();
builder.configureAttributes(ClientAttributes.clientRegistrationId(registrationId));
}
}
private ClientRegistrationIdProcessor() {
}
}
@@ -39,6 +39,8 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
class ClientRegistrationIdProcessorTests {
private static final String REGISTRATION_ID = "registrationId";
ClientRegistrationIdProcessor processor = ClientRegistrationIdProcessor.DEFAULT_INSTANCE;
@Test
@@ -48,32 +50,42 @@ class ClientRegistrationIdProcessorTests {
this.processor.process(hasClientRegistrationId, null, null, builder);
String registrationId = ClientAttributes.resolveClientRegistrationId(builder.build().getAttributes());
assertThat(registrationId).isEqualTo(RestService.REGISTRATION_ID);
assertThat(registrationId).isEqualTo(REGISTRATION_ID);
}
@Test
void processWhenMetaClientRegistrationIdPresentThenSet() {
HttpRequestValues.Builder builder = HttpRequestValues.builder();
Method hasClientRegistrationId = ReflectionUtils.findMethod(RestService.class, "hasMetaClientRegistrationId");
this.processor.process(hasClientRegistrationId, null, null, builder);
Method hasMetaClientRegistrationId = ReflectionUtils.findMethod(RestService.class,
"hasMetaClientRegistrationId");
this.processor.process(hasMetaClientRegistrationId, null, null, builder);
String registrationId = ClientAttributes.resolveClientRegistrationId(builder.build().getAttributes());
assertThat(registrationId).isEqualTo(RestService.REGISTRATION_ID);
assertThat(registrationId).isEqualTo(REGISTRATION_ID);
}
@Test
void processWhenNoClientRegistrationIdPresentThenNull() {
HttpRequestValues.Builder builder = HttpRequestValues.builder();
Method hasClientRegistrationId = ReflectionUtils.findMethod(RestService.class, "noClientRegistrationId");
this.processor.process(hasClientRegistrationId, null, null, builder);
Method noClientRegistrationId = ReflectionUtils.findMethod(RestService.class, "noClientRegistrationId");
this.processor.process(noClientRegistrationId, null, null, builder);
String registrationId = ClientAttributes.resolveClientRegistrationId(builder.build().getAttributes());
assertThat(registrationId).isNull();
}
interface RestService {
@Test
void processWhenClientRegistrationIdPresentOnDeclaringClassThenSet() {
HttpRequestValues.Builder builder = HttpRequestValues.builder();
Method declaringClassHasClientRegistrationId = ReflectionUtils.findMethod(AnnotatedRestService.class,
"declaringClassHasClientRegistrationId");
this.processor.process(declaringClassHasClientRegistrationId, null, null, builder);
String REGISTRATION_ID = "registrationId";
String registrationId = ClientAttributes.resolveClientRegistrationId(builder.build().getAttributes());
assertThat(registrationId).isEqualTo(REGISTRATION_ID);
}
interface RestService {
@ClientRegistrationId(REGISTRATION_ID)
void hasClientRegistrationId();
@@ -86,9 +98,16 @@ class ClientRegistrationIdProcessorTests {
}
@Retention(RetentionPolicy.RUNTIME)
@ClientRegistrationId(RestService.REGISTRATION_ID)
@ClientRegistrationId(REGISTRATION_ID)
@interface MetaClientRegistrationId {
}
@ClientRegistrationId(REGISTRATION_ID)
interface AnnotatedRestService {
void declaringClassHasClientRegistrationId();
}
}