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