From 1d13c5cdcb0f3938841e2b6ea07bf81040d6b167 Mon Sep 17 00:00:00 2001 From: Nicholas Blair <nicholas.blair@wisc.edu> Date: Thu, 18 Aug 2016 20:32:47 -0500 Subject: [PATCH] feat: adds YAML LocalUserDetailsLoader --- pom.xml | 8 +++- uw-spring-security-core/pom.xml | 4 ++ .../local/LocalUserDetailsManagerImpl.java | 10 ++++- .../local/YamlLocalUserDetailsLoader.java | 16 ++++++++ .../edu/wisc/uwss/local/local-users.yaml | 40 +++++++++++++++++++ .../LocalUserDetailsManagerImplTest.java | 34 ++++++++++++++-- 6 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 uw-spring-security-core/src/main/java/edu/wisc/uwss/local/YamlLocalUserDetailsLoader.java create mode 100644 uw-spring-security-core/src/main/resources/edu/wisc/uwss/local/local-users.yaml diff --git a/pom.xml b/pom.xml index f39c70e..da861de 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,7 @@ <properties> <adi.development.version>0.5.1</adi.development.version> + <jackson.version>2.7.4</jackson.version> <slf4j.version>1.7.7</slf4j.version> <spring.framework.version>4.1.6.RELEASE</spring.framework.version> <spring.security.version>4.0.1.RELEASE</spring.security.version> @@ -42,7 +43,12 @@ <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> - <version>2.5.0</version> + <version>${jackson.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.dataformat</groupId> + <artifactId>jackson-dataformat-yaml</artifactId> + <version>${jackson.version}</version> </dependency> <dependency> <groupId>edu.wisc.doit.adi</groupId> diff --git a/uw-spring-security-core/pom.xml b/uw-spring-security-core/pom.xml index 5719152..335745f 100644 --- a/uw-spring-security-core/pom.xml +++ b/uw-spring-security-core/pom.xml @@ -14,6 +14,10 @@ <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> + <dependency> + <groupId>com.fasterxml.jackson.dataformat</groupId> + <artifactId>jackson-dataformat-yaml</artifactId> + </dependency> <dependency> <groupId>edu.wisc.services.uds</groupId> <artifactId>uds-person-ws</artifactId> diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsManagerImpl.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsManagerImpl.java index 04b5ff0..4927a2d 100644 --- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsManagerImpl.java +++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsManagerImpl.java @@ -66,7 +66,6 @@ public class LocalUserDetailsManagerImpl implements UserDetailsManager { this.loaderEnabled = loaderEnabled; return this; } - /** * Visible for testing. * @@ -77,6 +76,15 @@ public class LocalUserDetailsManagerImpl implements UserDetailsManager { this.localUserResource = localUserResource; return this; } + /** + * + * @param localUserDetailsLoader + * @return a reference to this instance + */ + LocalUserDetailsManagerImpl setLocalUserDetailsLoader(LocalUserDetailsLoader localUserDetailsLoader) { + this.localUserDetailsLoader = localUserDetailsLoader; + return this; + } /** * diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/YamlLocalUserDetailsLoader.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/YamlLocalUserDetailsLoader.java new file mode 100644 index 0000000..0973e28 --- /dev/null +++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/YamlLocalUserDetailsLoader.java @@ -0,0 +1,16 @@ +package edu.wisc.uwss.local; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; + +/** + * {@link LocalUserDetailsLoader} implementation that can load YAML. + * + * @author Nicholas Blair + */ +public class YamlLocalUserDetailsLoader extends LocalUserDetailsLoader.Default { + @Override + protected ObjectMapper getObjectMapper() { + return new ObjectMapper(new YAMLFactory()); + } +} diff --git a/uw-spring-security-core/src/main/resources/edu/wisc/uwss/local/local-users.yaml b/uw-spring-security-core/src/main/resources/edu/wisc/uwss/local/local-users.yaml new file mode 100644 index 0000000..677bf6f --- /dev/null +++ b/uw-spring-security-core/src/main/resources/edu/wisc/uwss/local/local-users.yaml @@ -0,0 +1,40 @@ +--- +- pvi: "UW000A000" + username: "admin" + password: "admin" + fullName: "Amy Administrator" + emailAddress: "amy.administrator@demo.wisc.edu" + uddsMembership: + - "A535900" + authorities: [] + firstName: "Amy" + lastName: "Administrator" +- pvi: "UW000A001" + username: "jane" + password: "jane" + fullName: "Jane Doe" + emailAddress: "jane.doe@demo.wisc.edu" + uddsMembership: + - "A535005" + authorities: [] + firstName: "Jane" + lastName: "Doe" +- pvi: "UW000A002" + username: "john" + password: "john" + fullName: "John Doe" + emailAddress: "john.doe@demo.wisc.edu" + uddsMembership: + - "A535005" + authorities: [] + firstName: "John" + lastName: "Doe" +- pvi: "UW000A003" + username: "jim" + password: "jim" + fullName: "Jim Doe" + emailAddress: "jim.doe@demo.wisc.edu" + uddsMembership: [] + authorities: [] + firstName: "Jim" + lastName: "Doe" \ No newline at end of file diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/LocalUserDetailsManagerImplTest.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/LocalUserDetailsManagerImplTest.java index ceaa23a..5982c08 100644 --- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/LocalUserDetailsManagerImplTest.java +++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/LocalUserDetailsManagerImplTest.java @@ -3,6 +3,9 @@ */ package edu.wisc.uwss.local; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; + import edu.wisc.uwss.HasModifiableSource; import edu.wisc.uwss.UWUserDetails; import edu.wisc.uwss.UWUserDetailsImpl; @@ -15,6 +18,7 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import java.io.IOException; import java.util.Arrays; import java.util.Collection; +import java.util.List; import java.util.Properties; import static org.junit.Assert.*; @@ -90,7 +94,28 @@ public class LocalUserDetailsManagerImplTest { * @throws IOException */ @Test - public void init_compare_loader_vs_attributesmapper() throws IOException { + public void init_compare_default_loader_vs_attributesmapper() throws IOException { + Properties properties = new Properties(); + properties.load(new ClassPathResource("edu/wisc/uwss/local/local-users.properties").getInputStream()); + + LocalUserDetailsManagerImpl withAttributesMapper = new LocalUserDetailsManagerImpl(); + withAttributesMapper.setDemoUsers(properties); + withAttributesMapper.init(); + + LocalUserDetailsManagerImpl withLoader = new LocalUserDetailsManagerImpl() + .setLocalUserResource(new ClassPathResource("edu/wisc/uwss/local/local-users.json")) + .setLoaderEnabled(true); + withLoader.init(); + + assertEquals(withAttributesMapper.getUserCount(), withLoader.getUserCount()); + assertEquals(withAttributesMapper.loadUserByUsername("admin"), withLoader.loadUserByUsername("admin")); + assertEquals(withAttributesMapper.loadUserByUsername("jane"), withLoader.loadUserByUsername("jane")); + assertEquals(withAttributesMapper.loadUserByUsername("john"), withLoader.loadUserByUsername("john")); + assertEquals(withAttributesMapper.loadUserByUsername("jim"), withLoader.loadUserByUsername("jim")); + + } + @Test + public void init_compare_yaml_loader_vs_attributesmapper() throws IOException { Properties properties = new Properties(); properties.load(new ClassPathResource("edu/wisc/uwss/local/local-users.properties").getInputStream()); @@ -98,9 +123,10 @@ public class LocalUserDetailsManagerImplTest { withAttributesMapper.setDemoUsers(properties); withAttributesMapper.init(); - LocalUserDetailsManagerImpl withLoader = new LocalUserDetailsManagerImpl(); - withLoader.setLocalUserResource(new ClassPathResource("edu/wisc/uwss/local/local-users.json")); - withLoader.setLoaderEnabled(true); + LocalUserDetailsManagerImpl withLoader = new LocalUserDetailsManagerImpl() + .setLocalUserDetailsLoader(new YamlLocalUserDetailsLoader()) + .setLocalUserResource(new ClassPathResource("edu/wisc/uwss/local/local-users.json")) + .setLoaderEnabled(true); withLoader.init(); assertEquals(withAttributesMapper.getUserCount(), withLoader.getUserCount()); -- GitLab