Skip to content

Commit deaa94e

Browse files
committed
Support @ClientRegistrationId at Class Level
Closes gh-17806 Signed-off-by: Bernard Budano <[email protected]>
1 parent 093e930 commit deaa94e

File tree

3 files changed

+37
-14
lines changed

3 files changed

+37
-14
lines changed

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/annotation/ClientRegistrationId.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
* @since 7.0
3434
* @see org.springframework.security.oauth2.client.web.client.ClientRegistrationIdProcessor
3535
*/
36-
@Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
36+
@Target({ ElementType.METHOD, ElementType.TYPE })
3737
@Retention(RetentionPolicy.RUNTIME)
3838
@Documented
3939
public @interface ClientRegistrationId {

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/web/client/ClientRegistrationIdProcessor.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.security.oauth2.client.web.client;
1818

1919
import java.lang.reflect.Method;
20+
import java.util.Optional;
2021

2122
import org.jspecify.annotations.Nullable;
2223

@@ -37,17 +38,20 @@ public final class ClientRegistrationIdProcessor implements HttpRequestValues.Pr
3738

3839
public static ClientRegistrationIdProcessor DEFAULT_INSTANCE = new ClientRegistrationIdProcessor();
3940

41+
private ClientRegistrationIdProcessor() {
42+
}
43+
4044
@Override
4145
public void process(Method method, MethodParameter[] parameters, @Nullable Object[] arguments,
4246
HttpRequestValues.Builder builder) {
43-
ClientRegistrationId registeredId = AnnotationUtils.findAnnotation(method, ClientRegistrationId.class);
47+
ClientRegistrationId registeredId = Optional
48+
.ofNullable(AnnotationUtils.findAnnotation(method, ClientRegistrationId.class))
49+
.orElseGet(() -> AnnotationUtils.findAnnotation(method.getDeclaringClass(), ClientRegistrationId.class));
50+
4451
if (registeredId != null) {
4552
String registrationId = registeredId.registrationId();
4653
builder.configureAttributes(ClientAttributes.clientRegistrationId(registrationId));
4754
}
4855
}
4956

50-
private ClientRegistrationIdProcessor() {
51-
}
52-
5357
}

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/client/ClientRegistrationIdProcessorTests.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
*/
4040
class ClientRegistrationIdProcessorTests {
4141

42+
private static final String REGISTRATION_ID = "registrationId";
43+
4244
ClientRegistrationIdProcessor processor = ClientRegistrationIdProcessor.DEFAULT_INSTANCE;
4345

4446
@Test
@@ -48,32 +50,42 @@ void processWhenClientRegistrationIdPresentThenSet() {
4850
this.processor.process(hasClientRegistrationId, null, null, builder);
4951

5052
String registrationId = ClientAttributes.resolveClientRegistrationId(builder.build().getAttributes());
51-
assertThat(registrationId).isEqualTo(RestService.REGISTRATION_ID);
53+
assertThat(registrationId).isEqualTo(REGISTRATION_ID);
5254
}
5355

5456
@Test
5557
void processWhenMetaClientRegistrationIdPresentThenSet() {
5658
HttpRequestValues.Builder builder = HttpRequestValues.builder();
57-
Method hasClientRegistrationId = ReflectionUtils.findMethod(RestService.class, "hasMetaClientRegistrationId");
58-
this.processor.process(hasClientRegistrationId, null, null, builder);
59+
Method hasMetaClientRegistrationId = ReflectionUtils.findMethod(RestService.class,
60+
"hasMetaClientRegistrationId");
61+
this.processor.process(hasMetaClientRegistrationId, null, null, builder);
5962

6063
String registrationId = ClientAttributes.resolveClientRegistrationId(builder.build().getAttributes());
61-
assertThat(registrationId).isEqualTo(RestService.REGISTRATION_ID);
64+
assertThat(registrationId).isEqualTo(REGISTRATION_ID);
6265
}
6366

6467
@Test
6568
void processWhenNoClientRegistrationIdPresentThenNull() {
6669
HttpRequestValues.Builder builder = HttpRequestValues.builder();
67-
Method hasClientRegistrationId = ReflectionUtils.findMethod(RestService.class, "noClientRegistrationId");
68-
this.processor.process(hasClientRegistrationId, null, null, builder);
70+
Method noClientRegistrationId = ReflectionUtils.findMethod(RestService.class, "noClientRegistrationId");
71+
this.processor.process(noClientRegistrationId, null, null, builder);
6972

7073
String registrationId = ClientAttributes.resolveClientRegistrationId(builder.build().getAttributes());
7174
assertThat(registrationId).isNull();
7275
}
7376

74-
interface RestService {
77+
@Test
78+
void processWhenClientRegistrationIdPresentOnDeclaringClassThenSet() {
79+
HttpRequestValues.Builder builder = HttpRequestValues.builder();
80+
Method declaringClassHasClientRegistrationId = ReflectionUtils.findMethod(AnnotatedRestService.class,
81+
"declaringClassHasClientRegistrationId");
82+
this.processor.process(declaringClassHasClientRegistrationId, null, null, builder);
83+
84+
String registrationId = ClientAttributes.resolveClientRegistrationId(builder.build().getAttributes());
85+
assertThat(registrationId).isEqualTo(REGISTRATION_ID);
86+
}
7587

76-
String REGISTRATION_ID = "registrationId";
88+
interface RestService {
7789

7890
@ClientRegistrationId(REGISTRATION_ID)
7991
void hasClientRegistrationId();
@@ -86,9 +98,16 @@ interface RestService {
8698
}
8799

88100
@Retention(RetentionPolicy.RUNTIME)
89-
@ClientRegistrationId(RestService.REGISTRATION_ID)
101+
@ClientRegistrationId(REGISTRATION_ID)
90102
@interface MetaClientRegistrationId {
91103

92104
}
93105

106+
@ClientRegistrationId(REGISTRATION_ID)
107+
interface AnnotatedRestService {
108+
109+
void declaringClassHasClientRegistrationId();
110+
111+
}
112+
94113
}

0 commit comments

Comments
 (0)