From 190cfd9e02ca23e877b5f788b588ed3c4da1abdd Mon Sep 17 00:00:00 2001 From: Vedran Pavic Date: Thu, 4 Oct 2018 07:41:35 +0200 Subject: [PATCH] Allow in-memory client registration repos to be constructed with a map --- .../InMemoryClientRegistrationRepository.java | 23 +++++++++++++++---- ...yReactiveClientRegistrationRepository.java | 11 +++++++++ ...moryClientRegistrationRepositoryTests.java | 16 ++++++++++++- ...tiveClientRegistrationRepositoryTests.java | 17 ++++++++++++++ 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/registration/InMemoryClientRegistrationRepository.java b/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/registration/InMemoryClientRegistrationRepository.java index fa810e432b1..d6ac2c69869 100644 --- a/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/registration/InMemoryClientRegistrationRepository.java +++ b/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/registration/InMemoryClientRegistrationRepository.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -34,6 +34,7 @@ * * @author Joe Grandja * @author Rob Winch + * @author Vedran Pavic * @since 5.0 * @see ClientRegistrationRepository * @see ClientRegistration @@ -56,11 +57,25 @@ public InMemoryClientRegistrationRepository(ClientRegistration... registrations) * @param registrations the client registration(s) */ public InMemoryClientRegistrationRepository(List registrations) { + this(createRegistrationsMap(registrations)); + } + + private static Map createRegistrationsMap(List registrations) { Assert.notEmpty(registrations, "registrations cannot be empty"); Collector> collector = - toConcurrentMap(ClientRegistration::getRegistrationId, Function.identity()); - this.registrations = registrations.stream() - .collect(collectingAndThen(collector, Collections::unmodifiableMap)); + toConcurrentMap(ClientRegistration::getRegistrationId, Function.identity()); + return registrations.stream().collect(collectingAndThen(collector, Collections::unmodifiableMap)); + } + + /** + * Constructs an {@code InMemoryReactiveClientRegistrationRepository} backed by a {@link Map} of client ids to + * {@link ClientRegistration}s. + * + * @param registrations the map of client registration(s) + */ + public InMemoryClientRegistrationRepository(Map registrations) { + Assert.notNull(registrations, "registrations cannot be null"); + this.registrations = registrations; } @Override diff --git a/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/registration/InMemoryReactiveClientRegistrationRepository.java b/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/registration/InMemoryReactiveClientRegistrationRepository.java index fa291c6a4f5..87d2b130e08 100644 --- a/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/registration/InMemoryReactiveClientRegistrationRepository.java +++ b/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/registration/InMemoryReactiveClientRegistrationRepository.java @@ -30,6 +30,7 @@ * A Reactive {@link ClientRegistrationRepository} that stores {@link ClientRegistration}(s) in-memory. * * @author Rob Winch + * @author Vedran Pavic * @since 5.1 * @see ClientRegistrationRepository * @see ClientRegistration @@ -64,6 +65,16 @@ public InMemoryReactiveClientRegistrationRepository(List reg .collect(Collectors.toConcurrentMap(ClientRegistration::getRegistrationId, Function.identity())); } + /** + * Constructs an {@code InMemoryReactiveClientRegistrationRepository} backed by a {@link Map} of client ids to + * {@link ClientRegistration}s. Note that the supplied map must be a non-blocking map. + * + * @param registrations the map of client registration(s) + */ + public InMemoryReactiveClientRegistrationRepository(Map registrations) { + Assert.notNull(registrations, "registrations cannot be null"); + this.clientIdToClientRegistration = registrations; + } @Override public Mono findByRegistrationId(String registrationId) { diff --git a/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/registration/InMemoryClientRegistrationRepositoryTests.java b/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/registration/InMemoryClientRegistrationRepositoryTests.java index efae7de7a91..5628f307b6b 100644 --- a/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/registration/InMemoryClientRegistrationRepositoryTests.java +++ b/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/registration/InMemoryClientRegistrationRepositoryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -20,7 +20,9 @@ import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; @@ -28,6 +30,7 @@ * Tests for {@link InMemoryClientRegistrationRepository}. * * @author Rob Winch + * @author Vedran Pavic * @since 5.0 */ public class InMemoryClientRegistrationRepositoryTests { @@ -53,6 +56,17 @@ public void constructorListClientRegistrationWhenDuplicateIdThenIllegalArgumentE new InMemoryClientRegistrationRepository(registrations); } + @Test(expected = IllegalArgumentException.class) + public void constructorMapClientRegistrationWhenNullThenIllegalArgumentException() { + new InMemoryClientRegistrationRepository((Map) null); + } + + @Test + public void constructorMapClientRegistrationWhenEmptyMapThenRepositoryIsEmpty() { + InMemoryClientRegistrationRepository clients = new InMemoryClientRegistrationRepository(new HashMap<>()); + assertThat(clients).isEmpty(); + } + @Test public void findByRegistrationIdWhenFoundThenFound() { String id = this.registration.getRegistrationId(); diff --git a/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/registration/InMemoryReactiveClientRegistrationRepositoryTests.java b/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/registration/InMemoryReactiveClientRegistrationRepositoryTests.java index ba2ef432a4c..359e384ff2c 100644 --- a/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/registration/InMemoryReactiveClientRegistrationRepositoryTests.java +++ b/oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/registration/InMemoryReactiveClientRegistrationRepositoryTests.java @@ -19,7 +19,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.junit.Before; import org.junit.Test; @@ -28,6 +30,7 @@ /** * @author Rob Winch + * @author Vedran Pavic * @since 5.1 */ public class InMemoryReactiveClientRegistrationRepositoryTests { @@ -68,6 +71,20 @@ public void constructorWhenClientRegistrationIsNullThenIllegalArgumentException( .isInstanceOf(IllegalArgumentException.class); } + @Test + public void constructorWhenClientRegistrationMapIsNullThenIllegalArgumentException() { + Map registrations = null; + assertThatThrownBy(() -> new InMemoryReactiveClientRegistrationRepository(registrations)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + public void constructorWhenClientRegistrationMapIsEmptyThenRepositoryIsEmpty() { + InMemoryReactiveClientRegistrationRepository repository = new InMemoryReactiveClientRegistrationRepository( + new HashMap<>()); + assertThat(repository).isEmpty(); + } + @Test public void findByRegistrationIdWhenValidIdThenFound() { StepVerifier.create(this.repository.findByRegistrationId(this.registration.getRegistrationId()))