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