Skip to content

Commit 93cda94

Browse files
committed
Add attributes Consumer to OAuth2AuthorizationContext
Fixes gh-7385
1 parent f7d0385 commit 93cda94

File tree

5 files changed

+38
-11
lines changed

5 files changed

+38
-11
lines changed

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/AuthorizedClientServiceOAuth2AuthorizedClientManager.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
2222
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
2323
import org.springframework.util.Assert;
24+
import org.springframework.util.CollectionUtils;
2425
import org.springframework.util.StringUtils;
2526

2627
import java.util.Collections;
@@ -83,7 +84,12 @@ public OAuth2AuthorizedClient authorize(OAuth2AuthorizeRequest authorizeRequest)
8384
}
8485
OAuth2AuthorizationContext authorizationContext = contextBuilder
8586
.principal(principal)
86-
.attributes(this.contextAttributesMapper.apply(authorizeRequest))
87+
.attributes(attributes -> {
88+
Map<String, Object> contextAttributes = this.contextAttributesMapper.apply(authorizeRequest);
89+
if (!CollectionUtils.isEmpty(contextAttributes)) {
90+
attributes.putAll(contextAttributes);
91+
}
92+
})
8793
.build();
8894

8995
authorizedClient = this.authorizedClientProvider.authorize(authorizationContext);

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/OAuth2AuthorizationContext.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.HashMap;
2626
import java.util.LinkedHashMap;
2727
import java.util.Map;
28+
import java.util.function.Consumer;
2829

2930
/**
3031
* A context that holds authorization-specific state and is used by an {@link OAuth2AuthorizedClientProvider}
@@ -161,13 +162,16 @@ public Builder principal(Authentication principal) {
161162
}
162163

163164
/**
164-
* Sets the attributes associated to the context.
165+
* Provides a {@link Consumer} access to the attributes associated to the context.
165166
*
166-
* @param attributes the attributes associated to the context
167-
* @return the {@link Builder}
167+
* @param attributesConsumer a {@link Consumer} of the attributes associated to the context
168+
* @return the {@link OAuth2AuthorizeRequest.Builder}
168169
*/
169-
public Builder attributes(Map<String, Object> attributes) {
170-
this.attributes = attributes;
170+
public Builder attributes(Consumer<Map<String, Object>> attributesConsumer) {
171+
if (this.attributes == null) {
172+
this.attributes = new HashMap<>();
173+
}
174+
attributesConsumer.accept(this.attributes);
171175
return this;
172176
}
173177

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
2727
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
2828
import org.springframework.util.Assert;
29+
import org.springframework.util.CollectionUtils;
2930
import org.springframework.util.StringUtils;
3031
import org.springframework.web.context.request.RequestContextHolder;
3132
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -95,7 +96,12 @@ public OAuth2AuthorizedClient authorize(OAuth2AuthorizeRequest authorizeRequest)
9596
}
9697
OAuth2AuthorizationContext authorizationContext = contextBuilder
9798
.principal(principal)
98-
.attributes(this.contextAttributesMapper.apply(authorizeRequest))
99+
.attributes(attributes -> {
100+
Map<String, Object> contextAttributes = this.contextAttributesMapper.apply(authorizeRequest);
101+
if (!CollectionUtils.isEmpty(contextAttributes)) {
102+
attributes.putAll(contextAttributes);
103+
}
104+
})
99105
.build();
100106

101107
authorizedClient = this.authorizedClientProvider.authorize(authorizationContext);

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository;
2727
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
2828
import org.springframework.util.Assert;
29+
import org.springframework.util.CollectionUtils;
2930
import org.springframework.util.StringUtils;
3031
import org.springframework.web.server.ServerWebExchange;
3132
import reactor.core.publisher.Mono;
@@ -106,7 +107,11 @@ private Mono<OAuth2AuthorizationContext> authorizationContext(OAuth2AuthorizeReq
106107
.flatMap(this.contextAttributesMapper::apply)
107108
.map(attrs -> OAuth2AuthorizationContext.withAuthorizedClient(authorizedClient)
108109
.principal(authorizeRequest.getPrincipal())
109-
.attributes(attrs)
110+
.attributes(attributes -> {
111+
if (!CollectionUtils.isEmpty(attrs)) {
112+
attributes.putAll(attrs);
113+
}
114+
})
110115
.build());
111116
}
112117

@@ -116,7 +121,11 @@ private Mono<OAuth2AuthorizationContext> authorizationContext(OAuth2AuthorizeReq
116121
.flatMap(this.contextAttributesMapper::apply)
117122
.map(attrs -> OAuth2AuthorizationContext.withClientRegistration(clientRegistration)
118123
.principal(authorizeRequest.getPrincipal())
119-
.attributes(attrs)
124+
.attributes(attributes -> {
125+
if (!CollectionUtils.isEmpty(attrs)) {
126+
attributes.putAll(attrs);
127+
}
128+
})
120129
.build());
121130
}
122131

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/OAuth2AuthorizationContextTests.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,10 @@ public void withClientRegistrationWhenPrincipalIsNullThenThrowIllegalArgumentExc
6868
public void withAuthorizedClientWhenAllValuesProvidedThenAllValuesAreSet() {
6969
OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext.withAuthorizedClient(this.authorizedClient)
7070
.principal(this.principal)
71-
.attribute("attribute1", "value1")
72-
.attribute("attribute2", "value2")
71+
.attributes(attributes -> {
72+
attributes.put("attribute1", "value1");
73+
attributes.put("attribute2", "value2");
74+
})
7375
.build();
7476
assertThat(authorizationContext.getClientRegistration()).isSameAs(this.clientRegistration);
7577
assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);

0 commit comments

Comments
 (0)