From 62f063e566e73666555a5764def10d6cb38776cc Mon Sep 17 00:00:00 2001
From: Nicholas Blair <nicholas.blair@wisc.edu>
Date: Thu, 13 Oct 2016 09:49:17 -0500
Subject: [PATCH] refactor: switch autowiring to constructor injection

UdsPersonUserDetailsServiceImpl is not initialized automatically by either of the primary 'local-users' or 'preauth' Profiles. It's typically constructed by downstream projects manually (not by component scanning).

Registering more than 1 UserDetailsService - say one for the uw-spring-security stack, and a different one for UdsPersonUserDetailsServiceImpl - will result in ApplicationContext initializationerrors as the Configuration classes provided in uw-spring-security-config expect 1 and only 1 UserDetailsService.

The recommended use now for UdsPersonUserDetailsServiceImpl is to provide the needed UserDetailsService by hand, not by automatic autowiring. If the 1 UserDetailsService provided by uw-spring-security is appropriate, it's easy to retrieve from the ApplicationContext; if an alternate one is required it can be constructed without registering it as a @Bean.
---
 .../uwss/uds/UdsPersonUserDetailsServiceImpl.java   | 13 +++++++++++--
 .../java/edu/wisc/uwss/UWUserDetailsImplTest.java   |  5 +++++
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsServiceImpl.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsServiceImpl.java
index 285c7ef..1b152ec 100644
--- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsServiceImpl.java
+++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsServiceImpl.java
@@ -25,9 +25,18 @@ import edu.wisc.uwss.UWUserDetails;
  */
 public class UdsPersonUserDetailsServiceImpl implements UserDetailsService{
   
-  @Autowired UdsPersonService personService;
-  @Autowired(required=false) IdentifiersFactory identifiersFactory = new IdentifiersFactory.NetID();
+  protected UdsPersonService personService;
+  protected IdentifiersFactory identifiersFactory = new IdentifiersFactory.NetID();
 
+  @Autowired
+  public UdsPersonUserDetailsServiceImpl(UdsPersonService personService) {
+    this(personService, new IdentifiersFactory.NetID());
+  }
+  @Autowired(required=false)
+  public UdsPersonUserDetailsServiceImpl(UdsPersonService personService, IdentifiersFactory identifiersFactory) {
+    this.personService = personService;
+    this.identifiersFactory = identifiersFactory;
+  }
   @Override
   public UWUserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
     Identifiers identifiers = identifiersFactory.withValue(username);
diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/UWUserDetailsImplTest.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/UWUserDetailsImplTest.java
index b32e9f6..77f26aa 100644
--- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/UWUserDetailsImplTest.java
+++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/UWUserDetailsImplTest.java
@@ -83,4 +83,9 @@ public class UWUserDetailsImplTest {
     assertEquals(lower.getEmailAddress(), upper.getEmailAddress());
     assertEquals(lower.getEmailAddressHash(), upper.getEmailAddressHash());
   }
+
+  @Test
+  public void newInstance_success() {
+    UWUserDetailsImpl instance = UWUserDetailsImpl.newInstance("UW123A123", "bucky", "", "Bucky Badger", "bucky.badger@wisc.edu", Collections.<String>emptyList(), Collections.<String>emptyList());
+  }
 }
-- 
GitLab