Add attributes Consumer to OAuth2AuthorizationContext
Fixes gh-7385
This commit is contained in:
		
							parent
							
								
									f7d03858f1
								
							
						
					
					
						commit
						93cda94969
					
				| 
						 | 
				
			
			@ -21,6 +21,7 @@ import org.springframework.security.oauth2.client.registration.ClientRegistratio
 | 
			
		|||
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
 | 
			
		||||
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
import org.springframework.util.CollectionUtils;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +84,12 @@ public final class AuthorizedClientServiceOAuth2AuthorizedClientManager implemen
 | 
			
		|||
		}
 | 
			
		||||
		OAuth2AuthorizationContext authorizationContext = contextBuilder
 | 
			
		||||
				.principal(principal)
 | 
			
		||||
				.attributes(this.contextAttributesMapper.apply(authorizeRequest))
 | 
			
		||||
				.attributes(attributes -> {
 | 
			
		||||
					Map<String, Object> contextAttributes = this.contextAttributesMapper.apply(authorizeRequest);
 | 
			
		||||
					if (!CollectionUtils.isEmpty(contextAttributes)) {
 | 
			
		||||
						attributes.putAll(contextAttributes);
 | 
			
		||||
					}
 | 
			
		||||
				})
 | 
			
		||||
				.build();
 | 
			
		||||
 | 
			
		||||
		authorizedClient = this.authorizedClientProvider.authorize(authorizationContext);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,7 @@ import java.util.Collections;
 | 
			
		|||
import java.util.HashMap;
 | 
			
		||||
import java.util.LinkedHashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.function.Consumer;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A context that holds authorization-specific state and is used by an {@link OAuth2AuthorizedClientProvider}
 | 
			
		||||
| 
						 | 
				
			
			@ -161,13 +162,16 @@ public final class OAuth2AuthorizationContext {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * Sets the attributes associated to the context.
 | 
			
		||||
		 * Provides a {@link Consumer} access to the attributes associated to the context.
 | 
			
		||||
		 *
 | 
			
		||||
		 * @param attributes the attributes associated to the context
 | 
			
		||||
		 * @return the {@link Builder}
 | 
			
		||||
		 * @param attributesConsumer a {@link Consumer} of the attributes associated to the context
 | 
			
		||||
		 * @return the {@link OAuth2AuthorizeRequest.Builder}
 | 
			
		||||
		 */
 | 
			
		||||
		public Builder attributes(Map<String, Object> attributes) {
 | 
			
		||||
			this.attributes = attributes;
 | 
			
		||||
		public Builder attributes(Consumer<Map<String, Object>> attributesConsumer) {
 | 
			
		||||
			if (this.attributes == null) {
 | 
			
		||||
				this.attributes = new HashMap<>();
 | 
			
		||||
			}
 | 
			
		||||
			attributesConsumer.accept(this.attributes);
 | 
			
		||||
			return this;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@ import org.springframework.security.oauth2.client.registration.ClientRegistratio
 | 
			
		|||
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
 | 
			
		||||
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
import org.springframework.util.CollectionUtils;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
import org.springframework.web.context.request.RequestContextHolder;
 | 
			
		||||
import org.springframework.web.context.request.ServletRequestAttributes;
 | 
			
		||||
| 
						 | 
				
			
			@ -95,7 +96,12 @@ public final class DefaultOAuth2AuthorizedClientManager implements OAuth2Authori
 | 
			
		|||
		}
 | 
			
		||||
		OAuth2AuthorizationContext authorizationContext = contextBuilder
 | 
			
		||||
				.principal(principal)
 | 
			
		||||
				.attributes(this.contextAttributesMapper.apply(authorizeRequest))
 | 
			
		||||
				.attributes(attributes -> {
 | 
			
		||||
					Map<String, Object> contextAttributes = this.contextAttributesMapper.apply(authorizeRequest);
 | 
			
		||||
					if (!CollectionUtils.isEmpty(contextAttributes)) {
 | 
			
		||||
						attributes.putAll(contextAttributes);
 | 
			
		||||
					}
 | 
			
		||||
				})
 | 
			
		||||
				.build();
 | 
			
		||||
 | 
			
		||||
		authorizedClient = this.authorizedClientProvider.authorize(authorizationContext);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@ import org.springframework.security.oauth2.client.registration.ReactiveClientReg
 | 
			
		|||
import org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository;
 | 
			
		||||
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
 | 
			
		||||
import org.springframework.util.Assert;
 | 
			
		||||
import org.springframework.util.CollectionUtils;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
import org.springframework.web.server.ServerWebExchange;
 | 
			
		||||
import reactor.core.publisher.Mono;
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +107,11 @@ public final class DefaultReactiveOAuth2AuthorizedClientManager implements React
 | 
			
		|||
				.flatMap(this.contextAttributesMapper::apply)
 | 
			
		||||
				.map(attrs -> OAuth2AuthorizationContext.withAuthorizedClient(authorizedClient)
 | 
			
		||||
						.principal(authorizeRequest.getPrincipal())
 | 
			
		||||
						.attributes(attrs)
 | 
			
		||||
						.attributes(attributes -> {
 | 
			
		||||
							if (!CollectionUtils.isEmpty(attrs)) {
 | 
			
		||||
								attributes.putAll(attrs);
 | 
			
		||||
							}
 | 
			
		||||
						})
 | 
			
		||||
						.build());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -116,7 +121,11 @@ public final class DefaultReactiveOAuth2AuthorizedClientManager implements React
 | 
			
		|||
				.flatMap(this.contextAttributesMapper::apply)
 | 
			
		||||
				.map(attrs -> OAuth2AuthorizationContext.withClientRegistration(clientRegistration)
 | 
			
		||||
						.principal(authorizeRequest.getPrincipal())
 | 
			
		||||
						.attributes(attrs)
 | 
			
		||||
						.attributes(attributes -> {
 | 
			
		||||
							if (!CollectionUtils.isEmpty(attrs)) {
 | 
			
		||||
								attributes.putAll(attrs);
 | 
			
		||||
							}
 | 
			
		||||
						})
 | 
			
		||||
						.build());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,8 +68,10 @@ public class OAuth2AuthorizationContextTests {
 | 
			
		|||
	public void withAuthorizedClientWhenAllValuesProvidedThenAllValuesAreSet() {
 | 
			
		||||
		OAuth2AuthorizationContext authorizationContext = OAuth2AuthorizationContext.withAuthorizedClient(this.authorizedClient)
 | 
			
		||||
				.principal(this.principal)
 | 
			
		||||
				.attribute("attribute1", "value1")
 | 
			
		||||
				.attribute("attribute2", "value2")
 | 
			
		||||
				.attributes(attributes -> {
 | 
			
		||||
					attributes.put("attribute1", "value1");
 | 
			
		||||
					attributes.put("attribute2", "value2");
 | 
			
		||||
				})
 | 
			
		||||
				.build();
 | 
			
		||||
		assertThat(authorizationContext.getClientRegistration()).isSameAs(this.clientRegistration);
 | 
			
		||||
		assertThat(authorizationContext.getAuthorizedClient()).isSameAs(this.authorizedClient);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue