diff --git a/README.md b/README.md index 67e01f8fbf5c31d431b27ff0a483c79fea9aebdc..418c7bb926f80e1f549415a6c28838ba184f2506 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,8 @@ and get back an instance of [UWUserDetails](uw-spring-security-core/src/main/jav customLogoutUrl: null, isisEmplid: null, firstName: null, - lastName: null + lastName: null, + displayName: null } ``` diff --git a/pom.xml b/pom.xml index d88cecb56408bcab42a5b76414a35286a1c7aaae..9bca073faf6a9390297e5e374cc869b3936fdf39 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>edu.wisc.uwss</groupId> <artifactId>uw-spring-security</artifactId> - <version>1.7.1-SNAPSHOT</version> + <version>2.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>UW Spring Security Parent</name> <description>Parent project for module to integrate Spring Security with UW authentication mechanism.</description> @@ -29,6 +29,10 @@ <id>code.doit-uw-releases</id> <url>https://code.doit.wisc.edu/maven/content/repositories/uw-releases/</url> </repository> + <repository> + <id>code.doit-public-releases</id> + <url>https://code.doit.wisc.edu/maven/content/repositories/public-releases</url> + </repository> </repositories> <properties> @@ -62,24 +66,33 @@ </dependency> <dependency> <groupId>edu.wisc.services.uds</groupId> - <artifactId>uds-person-data-model-1.1</artifactId> - <version>1.1.0</version> + <artifactId>uds-person-data-model-1.2</artifactId> + <version>1.0.0</version> + </dependency> + + <dependency> + <groupId>edu.wisc.services.uds</groupId> + <artifactId>uds-person-client-java</artifactId> + <version>2.0.0</version> + <exclusions> + <exclusion> + <groupId>org.apache.santuario</groupId> + <artifactId>xmlsec</artifactId> + </exclusion> + <exclusion> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-core</artifactId> + </exclusion> + <exclusion> + <groupId>org.springframework.ws</groupId> + <artifactId>spring-ws-core</artifactId> + </exclusion> + <exclusion> + <groupId>org.springframework.ws</groupId> + <artifactId>spring-ws-security</artifactId> + </exclusion> + </exclusions> </dependency> - <dependency> - <groupId>edu.wisc.services.uds</groupId> - <artifactId>uds-person-ws</artifactId> - <version>1.1.0</version> - <exclusions> - <exclusion> - <groupId>org.springframework.ws</groupId> - <artifactId>spring-ws-core</artifactId> - </exclusion> - <exclusion> - <groupId>org.springframework.ws</groupId> - <artifactId>spring-ws-security</artifactId> - </exclusion> - </exclusions> - </dependency> <dependency> <groupId>edu.wisc.uwss</groupId> <artifactId>uw-spring-security-config</artifactId> diff --git a/uw-spring-security-config/pom.xml b/uw-spring-security-config/pom.xml index bebbdf2853c5b67874df00e813ddf8a101e9faa5..058dda02cdb85986c359dd1fd0e9995a2cbf6cc1 100644 --- a/uw-spring-security-config/pom.xml +++ b/uw-spring-security-config/pom.xml @@ -3,7 +3,7 @@ <parent> <groupId>edu.wisc.uwss</groupId> <artifactId>uw-spring-security</artifactId> - <version>1.7.1-SNAPSHOT</version> + <version>2.0.0-SNAPSHOT</version> </parent> <artifactId>uw-spring-security-config</artifactId> <name>UW Spring Security Configuration</name> diff --git a/uw-spring-security-config/src/main/java/edu/wisc/uwss/configuration/local/LocalAuthenticationSecurityConfiguration.java b/uw-spring-security-config/src/main/java/edu/wisc/uwss/configuration/local/LocalAuthenticationSecurityConfiguration.java index 0880a298f40d07335a6be9279d5fb446555d2fd9..384f95f074617130669d038ff861cead8143ffb1 100644 --- a/uw-spring-security-config/src/main/java/edu/wisc/uwss/configuration/local/LocalAuthenticationSecurityConfiguration.java +++ b/uw-spring-security-config/src/main/java/edu/wisc/uwss/configuration/local/LocalAuthenticationSecurityConfiguration.java @@ -55,24 +55,7 @@ public class LocalAuthenticationSecurityConfiguration extends GlobalMethodSecuri public UserDetailsManager localUserDetailsManager() { return new LocalUserDetailsManagerImpl(); } - /** - * - * @return a {@link Properties} instance containing all local user accounts. - */ - @Bean @Qualifier("demo-users") @Value("${edu.wisc.uwss.local.userdetails.resource:classpath:/edu/wisc/uwss/local/local-users.properties}") - public Properties demoUserProperties(String resourcePath) { - logger.info("local-users loading demo users from {}", resourcePath); - Resource resource = this.resourceLoader.getResource(resourcePath); - PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); - propertiesFactoryBean.setLocation(resource); - Properties properties = null; - try { - propertiesFactoryBean.afterPropertiesSet(); - properties = propertiesFactoryBean.getObject(); - } catch (IOException e) { - throw new IllegalStateException("unable to load demo users from resource path: "+resourcePath, e); - } - return properties; - } + + } diff --git a/uw-spring-security-config/src/main/resources/edu/wisc/uwss/configuration/uwss-SAMPLE.properties b/uw-spring-security-config/src/main/resources/edu/wisc/uwss/configuration/uwss-SAMPLE.properties index 9d0eae9645f0c3a6a6562c7cceeb9e75bdd442dc..a5665dc122a64206fe2f35201a29ef4a4293b060 100644 --- a/uw-spring-security-config/src/main/resources/edu/wisc/uwss/configuration/uwss-SAMPLE.properties +++ b/uw-spring-security-config/src/main/resources/edu/wisc/uwss/configuration/uwss-SAMPLE.properties @@ -6,6 +6,7 @@ preauth.headerValues=admin;admin@wisc.edu;UW000A000;Amy Administrator;A535000;am #preauth.pviHeader=wiscedupvi #preauth.usernameHeader=uid #preauth.fullnameHeader=cn +#preauth.displayNameHeader=displayName #preauth.uddsHeader=wisceduudds #preauth.emailAddressHeader=mail #preauth.identityProviderHeader=Shib-Identity-Provider diff --git a/uw-spring-security-config/src/test/java/edu/wisc/uwss/configuration/local/LocalConfigurationTest.java b/uw-spring-security-config/src/test/java/edu/wisc/uwss/configuration/local/LocalConfigurationTest.java index ee428edb66a553a34b5058569afc34eb479a1d6e..2530b48047c2d9645703c2dd1803ca44ce4a7b16 100644 --- a/uw-spring-security-config/src/test/java/edu/wisc/uwss/configuration/local/LocalConfigurationTest.java +++ b/uw-spring-security-config/src/test/java/edu/wisc/uwss/configuration/local/LocalConfigurationTest.java @@ -15,6 +15,8 @@ import org.springframework.web.context.support.AnnotationConfigWebApplicationCon import edu.wisc.uwss.local.LocalUserDetailsManagerImpl; +import java.util.Properties; + /** * A unit test that activates the {@link Configuration} classes in the "edu.wisc.uwss.configuration.local" package. * diff --git a/uw-spring-security-core/pom.xml b/uw-spring-security-core/pom.xml index 01a792994658c74821fb6e774e3dae563c74d43d..cb4b56687a2ac97ffb1c158f764105e770473dba 100644 --- a/uw-spring-security-core/pom.xml +++ b/uw-spring-security-core/pom.xml @@ -3,7 +3,7 @@ <parent> <groupId>edu.wisc.uwss</groupId> <artifactId>uw-spring-security</artifactId> - <version>1.7.1-SNAPSHOT</version> + <version>2.0.0-SNAPSHOT</version> </parent> <artifactId>uw-spring-security-core</artifactId> <name>UW Spring Security Core</name> @@ -18,10 +18,14 @@ <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> </dependency> - <dependency> + <!--<dependency> <groupId>edu.wisc.services.uds</groupId> <artifactId>uds-person-ws</artifactId> - </dependency> + </dependency>--> + <dependency> + <groupId>edu.wisc.services.uds</groupId> + <artifactId>uds-person-client-java</artifactId> + </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetails.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetails.java index d0e6954bf82b420570ade3498ebe3dc244588373..2c63fc665f2f5d1fecce4b03471833b3d9ac77b6 100644 --- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetails.java +++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetails.java @@ -47,6 +47,13 @@ public interface UWUserDetails extends UserDetails { */ String getFullName(); + /** + * The Display Name is the preferred name if the user has set one, otherwise is simply + * the full name. + * @return the display name for this user, or null if not available + */ + String getDisplayName(); + /** * @return a never null, but potentially empty, {@link Collection} of {@link String}s each * representing the UDDS Ids of the groups this user is a member of. diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetailsImpl.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetailsImpl.java index 00ed3537d96b8bd2e8df0be9a2d728aad0f6b52a..6fdd401928c3668ebc71c9574e613327df0370c2 100644 --- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetailsImpl.java +++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/UWUserDetailsImpl.java @@ -39,6 +39,8 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia private String isisEmplid; private String firstName; private String lastName; + private String displayName; + /** * * @param pvi @@ -126,6 +128,7 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia setSource(original.getSource()); setFirstName(original.getFirstName()); setLastName(original.getLastName()); + setDisplayName(original.getDisplayName()); } /* (non-Javadoc) @@ -140,6 +143,15 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia return this.fullName; } + public String getDisplayName() { + return this.displayName; + } + + public UWUserDetailsImpl setDisplayName(String displayName) { + this.displayName = displayName; + return this; + } + public Collection<String> getUddsMembership() { return uddsMembership; } @@ -214,6 +226,7 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia .append("; "); sb.append("Source: ").append(getSource()).append("; "); sb.append("Emplid: ").append(getIsisEmplid()).append("; "); + sb.append("DisplayName: ").append(getDisplayName()).append("; "); sb.append("Custom Logout Url: ").append(getCustomLogoutUrl()); return sb.toString(); @@ -271,6 +284,7 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia if (eppn != null ? !eppn.equals(that.eppn) : that.eppn != null) return false; if (pvi != null ? !pvi.equals(that.pvi) : that.pvi != null) return false; if (fullName != null ? !fullName.equals(that.fullName) : that.fullName != null) return false; + if (displayName != null ? !displayName.equals(that.displayName) : that.displayName != null) return false; if (uddsMembership != null ? !uddsMembership.equals(that.uddsMembership) : that.uddsMembership != null) return false; if (emailAddress != null ? !emailAddress.equals(that.emailAddress) : that.emailAddress != null) @@ -292,6 +306,7 @@ public class UWUserDetailsImpl extends User implements UWUserDetails, HasModifia result = 31 * result + (eppn != null ? eppn.hashCode() : 0); result = 31 * result + (pvi != null ? pvi.hashCode() : 0); result = 31 * result + (fullName != null ? fullName.hashCode() : 0); + result = 31 * result + (displayName != null ? displayName.hashCode() : 0); result = 31 * result + (uddsMembership != null ? uddsMembership.hashCode() : 0); result = 31 * result + (emailAddress != null ? emailAddress.hashCode() : 0); result = 31 * result + (source != null ? source.hashCode() : 0); diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsAttributesMapper.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsAttributesMapper.java deleted file mode 100644 index 8e85c680158d83958bd8aa85f0dfa949708ee9b1..0000000000000000000000000000000000000000 --- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUserDetailsAttributesMapper.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * - */ -package edu.wisc.uwss.local; - -import edu.wisc.uwss.UWUserDetails; -import edu.wisc.uwss.UWUserDetailsImpl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/** - * Interface providing a mechanism to bind a row from the local users properties - * file to a {@link UWUserDetails} instance. - * - * This interface is used during application initialization - not during - * authentication attempts. Since it is executed during Spring ApplicationContext initialization, - * implementations should avoid injecting other service or dao interfaces, as it may be - * affected by a race condition. - * - * If you have custom {@link UWUserDetails} that depend on services/daos to complete the model, - * you may want to consider implementing a {@link LocalUsersAuthenticationAttemptCallback}; that interface - * participates in the authentication attempt itself, not during application initialization. - * - * @deprecated use {@link LocalUserDetailsLoader} instead, to be removed in 2.0 - * @author Nicholas Blair - */ -@Deprecated -public interface LocalUserDetailsAttributesMapper { - - /** - * Map a list of attributes to a {@link UWUserDetails}. - * - * @param username the value to use from {@link UWUserDetails#getUsername()} - * @param row the values from a row in the properties file, in order - * @return a {@link UWUserDetails} instance (never null) - * @throws IllegalArgumentException if the row is malformed - */ - UWUserDetails mapUser(String username, String [] row); - - /** - * Default {@link LocalUserDetailsAttributesMapper} implementation. - * - * @author Nicholas Blair - */ - public static class Default implements LocalUserDetailsAttributesMapper { - - private static final Logger logger = LoggerFactory.getLogger(LocalUserDetailsAttributesMapper.class); - - /** - * {@inheritDoc} - * - * The format of the properties is as follows (key=value): - * <pre> - * username=password,fullName,firstName,lastName,emailAddress[,membership1,[membership2...]] - * </pre> - * - * Membership can be 1 or more UDDS values, comma separated. - */ - @Override - public UWUserDetails mapUser(String username, String[] values) { - if (values.length > 6) { - String[] uddsValues = Arrays.copyOfRange(values, 6, values.length); - List<String> membership = new ArrayList<>(); - Collections.addAll(membership, uddsValues); - // pvi, username, password, email, - return new UWUserDetailsImpl(values[1], username, values[0], values[2], values[5], membership) - .setFirstName(values[3]) - .setLastName(values[4]); - } else if (values.length == 6) { - // String pvi, String username, String password, String fullName, String emailAddress - return new UWUserDetailsImpl(values[1], username, values[0], values[2], values[5]) - .setFirstName(values[3]) - .setLastName(values[4]); - } - return mapUserDeprecatedFormat(username, values); - - } - - @Deprecated - UWUserDetails mapUserDeprecatedFormat(String username, String[] values) { - if (values.length == 5) { - logger.warn("Mapping deprecated in UWSS 1.2. Expected: username=password,fullName,firstName,lastName,emailAddress[,membership1,[membership2...]]"); - List<String> membership = new ArrayList<>(); - membership.add(values[4]); - return new UWUserDetailsImpl(values[1], username, values[0], values[2], values[3], membership); - } else { - //length must equal 4 - logger.warn("Mapping deprecated in UWSS 1.2. Expected: username=password,fullName,firstName,lastName,emailAddress[,membership1,[membership2...]]"); - return new UWUserDetailsImpl(values[1], username, values[0], values[2], values[3]); - } - } - } -} 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 3e3683bbcec55c4d7a0f7ba6c7a65487353d84ed..03d4c41a241a4e6d569218bc30de0a6001d8d950 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 @@ -46,26 +46,15 @@ public class LocalUserDetailsManagerImpl implements UserDetailsManager { @Autowired(required=false) private List<LocalUsersAuthenticationAttemptCallback> callbacks = new ArrayList<>(); @Autowired(required=false) - private LocalUserDetailsAttributesMapper localUserDetailsAttributeMapper = new LocalUserDetailsAttributesMapper.Default(); - @Autowired(required=false) private LocalUserDetailsLoader localUserDetailsLoader = new LocalUserDetailsLoader.Default(); @Value("#{environment['edu.wisc.uwss.local.userDetailsLoader.resource'] ?: 'classpath:/edu/wisc/uwss/local/local-users.json' }") private Resource localUserResource; - @Value("#{environment['edu.wisc.uwss.local.userDetailsLoader.enabled'] ?: false }") + @Value("#{environment['edu.wisc.uwss.local.userDetailsLoader.enabled'] ?: true }") private boolean loaderEnabled; private Properties properties = new Properties(); - /** - * Visible for testing. - * - * @param loaderEnabled whether or not to enable the {@link LocalUserDetailsLoader} - * @return a reference to this instance - */ - LocalUserDetailsManagerImpl setLoaderEnabled(boolean loaderEnabled) { - this.loaderEnabled = loaderEnabled; - return this; - } + /** * Visible for testing. * @@ -91,33 +80,12 @@ public class LocalUserDetailsManagerImpl implements UserDetailsManager { */ @PostConstruct public void init() { - if(loaderEnabled) { logger.debug("LocalUserDetailsLoader of type {} enabled, processing resource {}", localUserDetailsLoader.getClass(), localUserResource); List<UWUserDetails> users = localUserDetailsLoader.loadUsers(localUserResource); for(UWUserDetails u : users) { addDemoUser(u); } - } else { - logger.debug("LocalUserDetailsAttributesMapper of type {} enabled, processing properties file of size {}", localUserDetailsAttributeMapper.getClass(), properties.size()); - for (Entry<Object, Object> entry : properties.entrySet()) { - String[] values = ((String) entry.getValue()).split(","); - String username = (String) entry.getKey(); - - final UWUserDetails user = localUserDetailsAttributeMapper.mapUser(username, values); - addDemoUser(user); - } - } - } - /** - * Populate the internal map of {@link UWUserDetailsImpl} via the entries in the - * injected {@link Properties}. - * - * @see LocalUserDetailsAttributesMapper - * @param properties - */ - @Autowired - public void setDemoUsers(@Qualifier("demo-users") Properties properties) { - this.properties = properties; + } /** diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersAuthenticationAttemptCallback.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersAuthenticationAttemptCallback.java index f862109e514a70df950f2ec50cf246bc3486d209..8ed1aa56ddabb2445f8c7e6b2d144a9e5c1a4c59 100644 --- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersAuthenticationAttemptCallback.java +++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersAuthenticationAttemptCallback.java @@ -24,7 +24,7 @@ import edu.wisc.uwss.UWUserDetails; * if you need a particular order of execution. * * If instead you need to modify {@link UWUserDetails} instances during application initialization only, - * see {@link LocalUserDetailsAttributesMapper}. + * see {@link LocalUserDetailsLoader}. * * @author Nicholas Blair */ diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersUdsPersonServiceImpl.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersUdsPersonServiceImpl.java index a499be1f21ce3247f6ce693091b906f9d5cb3dca..66e6d903aedff90310c2c9f92c70222fae727194 100644 --- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersUdsPersonServiceImpl.java +++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/local/LocalUsersUdsPersonServiceImpl.java @@ -12,15 +12,15 @@ import org.springframework.context.annotation.Profile; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; -import edu.wisc.services.uds.person.v1_1.Appointment; -import edu.wisc.services.uds.person.v1_1.Appointments; -import edu.wisc.services.uds.person.v1_1.Demographic; -import edu.wisc.services.uds.person.v1_1.Employee; -import edu.wisc.services.uds.person.v1_1.Identifier; -import edu.wisc.services.uds.person.v1_1.Identifiers; -import edu.wisc.services.uds.person.v1_1.Name; -import edu.wisc.services.uds.person.v1_1.Person; -import edu.wisc.services.uds.person.v1_1.UDDS; +import edu.wisc.uds.person.Appointment; +import edu.wisc.uds.person.Appointments; +import edu.wisc.uds.person.Demographic; +import edu.wisc.uds.person.Employee; +import edu.wisc.uds.person.Identifier; +import edu.wisc.uds.person.Identifiers; +import edu.wisc.uds.person.Name; +import edu.wisc.uds.person.Person; +import edu.wisc.uds.person.UDDS; import edu.wisc.uds.UdsPersonService; import edu.wisc.uwss.UWUserDetails; @@ -37,7 +37,7 @@ public class LocalUsersUdsPersonServiceImpl implements UdsPersonService { @Autowired private UserDetailsService userDetailsService; /* (non-Javadoc) - * @see edu.wisc.uds.UdsPersonService#getPerson(edu.wisc.services.uds.person.v1_1.Identifiers) + * @see edu.wisc.uds.UdsPersonService#getPerson(edu.wisc.uds.person.Identifiers) */ @Override public Person getPerson(Identifiers identifiers) { diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapper.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapper.java index 5f49a42c5fb9785904ef1177a7af7b706f5034f9..ef6a2f314f6facc910f55f48ec8068035983910b 100644 --- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapper.java +++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapper.java @@ -56,6 +56,7 @@ public interface PreauthenticatedUserDetailsAttributeMapper { private String uddsHeader = "wisceduudds"; private String emailAddressHeader = "mail"; private String firstNameHeader = "givenName"; + private String displayNameHeader = "displayName"; private String lastNameHeader = "sn"; private String isisEmplidHeader = "wisceduisisemplid"; private String identityProviderHeader = "Shib-Identity-Provider"; @@ -85,6 +86,7 @@ public interface PreauthenticatedUserDetailsAttributeMapper { String emplid = request.getHeader(isisEmplidHeader); Collection<String> uddsMembership = safeGetHeaders(request, uddsHeader); String email = request.getHeader(emailAddressHeader); + String displayName = request.getHeader(displayNameHeader); Collection<String> manifestGroups = new ArrayList<>(); String manifestValue = request.getHeader(manifestHeader); @@ -105,6 +107,7 @@ public interface PreauthenticatedUserDetailsAttributeMapper { result.setLastName(request.getHeader(lastNameHeader)); String identityProvider = request.getHeader(identityProviderHeader); result.setCustomLogoutUrl(toCustomLogoutUrl(identityProvider)); + result.setDisplayName(displayName); logger.debug("mapUser constructed {} from headers in request", result); return result; @@ -221,6 +224,17 @@ public interface PreauthenticatedUserDetailsAttributeMapper { public void setFullNameHeader(String fullNameHeader) { this.fullNameHeader = fullNameHeader; } + /** + * + * @return the displayNameHeader + */ + public String getDisplayNameHeader() { return displayNameHeader; } + /** + * + * @param displayNameHeader the displayNameHeader to set + */ + @Value("${preauth.displayNameHeader:displayName") + public void setDisplayNameHeader(String displayNameHeader) { this.displayNameHeader = displayNameHeader; } /** * @return the uddsHeader */ diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersBuilder.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersBuilder.java index d015c2ab0f100d77cf52ebc2bb3b9553d294583a..921aede6fe2f1f77490483634f10913e903ed1bb 100644 --- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersBuilder.java +++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersBuilder.java @@ -3,8 +3,8 @@ package edu.wisc.uwss.uds; import java.util.ArrayList; import java.util.List; -import edu.wisc.services.uds.person.v1_1.Identifier; -import edu.wisc.services.uds.person.v1_1.Identifiers; +import edu.wisc.uds.person.Identifier; +import edu.wisc.uds.person.Identifiers; /** * Builder pattern for constructing {@link IdentifiersBuilder}. diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersFactory.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersFactory.java index d09a0ccf24a9377c8b0f73cf981480fab175efb1..65f60dcc4201977ce6d9d7b1c22c94b115b46a5f 100644 --- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersFactory.java +++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/IdentifiersFactory.java @@ -1,6 +1,7 @@ package edu.wisc.uwss.uds; -import edu.wisc.services.uds.person.v1_1.Identifiers; + +import edu.wisc.uds.person.Identifiers; /** * Factory interface for constructing {@link Identifiers} for use with {@link UdsPersonUserDetailsServiceImpl}. diff --git a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImpl.java b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImpl.java index da5aa1b30d06489bbbd78c66a08bfdd95c202494..41814c3b730d3daaa9c74a09180b57b1476de31e 100644 --- a/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImpl.java +++ b/uw-spring-security-core/src/main/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImpl.java @@ -11,13 +11,13 @@ import java.util.Set; import org.springframework.security.core.GrantedAuthority; import org.springframework.util.Assert; -import edu.wisc.services.uds.person.v1_1.Appointment; -import edu.wisc.services.uds.person.v1_1.Appointments; -import edu.wisc.services.uds.person.v1_1.Demographic; -import edu.wisc.services.uds.person.v1_1.Employee; -import edu.wisc.services.uds.person.v1_1.Identifier; -import edu.wisc.services.uds.person.v1_1.Name; -import edu.wisc.services.uds.person.v1_1.Person; +import edu.wisc.uds.person.Appointment; +import edu.wisc.uds.person.Appointments; +import edu.wisc.uds.person.Demographic; +import edu.wisc.uds.person.Employee; +import edu.wisc.uds.person.Identifier; +import edu.wisc.uds.person.Name; +import edu.wisc.uds.person.Person; import edu.wisc.uwss.UWUserDetails; /** @@ -210,7 +210,7 @@ public class UdsPersonUserDetailsImpl implements UWUserDetails { * This implementation always returns null. * * TODO it may be possible to extract an emplid value from person.getIdentifiers - * Example observed: edu.wisc.services.uds.person.v1_1.Identifier@715ef617[source=UWMSNSS, idName=EMPLID, value=000123456] + * Example observed: edu.wisc.uds.person.Identifier@715ef617[source=UWMSNSS, idName=EMPLID, value=000123456] */ @Override public String getIsisEmplid() { @@ -238,6 +238,40 @@ public class UdsPersonUserDetailsImpl implements UWUserDetails { public String getLastName() { return getName() != null ? getName().getLast() : null; } + + /** + * Construct the Display Name from the preferred name. + * + * @return displayName value + */ + @Override + public String getDisplayName() { + if(getName()!=null) { + StringBuilder stringBuilder = new StringBuilder(); + + + /** + * If the preferred first name is empty, then use the + * given name. Shib should already be doing this + * for preauthenticated users. + */ + if(getName().getPreferredFirst()!=null) { + stringBuilder.append(getName().getPreferredFirst()); + } else if(getName().getFirst()!=null) { + stringBuilder.append(getName().getFirst()); + } + + if(getName().getLast()!=null) { + if(stringBuilder.length()>0) { + stringBuilder.append(" "); + } + stringBuilder.append(getName().getLast()); + } + return stringBuilder.toString(); + } else { + return null; + } + } /** * * @return {@link Demographic#getName()}, or null if not available 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 1b152ec735211a4db8a8ea4245fb02428b08cb18..5934c39c69439dbee2743bff4b385b4fafbc317b 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 @@ -7,9 +7,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; -import edu.wisc.services.uds.person.v1_1.Identifier; -import edu.wisc.services.uds.person.v1_1.Identifiers; -import edu.wisc.services.uds.person.v1_1.Person; +import edu.wisc.uds.person.Identifier; +import edu.wisc.uds.person.Identifiers; +import edu.wisc.uds.person.Person; import edu.wisc.uds.UdsPersonService; import edu.wisc.uwss.UWUserDetails; diff --git a/uw-spring-security-core/src/main/resources/edu/wisc/uwss/local/local-users.properties b/uw-spring-security-core/src/main/resources/edu/wisc/uwss/local/local-users.properties deleted file mode 100644 index 8df9dbe5f6514be10e820fcf4da4ab85b10a9e21..0000000000000000000000000000000000000000 --- a/uw-spring-security-core/src/main/resources/edu/wisc/uwss/local/local-users.properties +++ /dev/null @@ -1,4 +0,0 @@ -admin=admin,UW000A000,Amy Administrator,Amy,Administrator,amy.administrator@demo.wisc.edu,A535900 -jane=jane,UW000A001,Jane Doe,Jane,Doe,jane.doe@demo.wisc.edu,A535005 -john=john,UW000A002,John Doe,John,Doe,john.doe@demo.wisc.edu,A535005 -jim=jim,UW000A003,Jim Doe,Jim,Doe,jim.doe@demo.wisc.edu \ 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 4a4c9721e9fb0c4e74bf1b040d634f11e3c261bc..c7b07a4e43f2cd2fde603d429469b277518b8a65 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 @@ -65,11 +65,8 @@ public class LocalUserDetailsManagerImplTest { */ @Test public void init_demoUsers_control() throws IOException { - Properties properties = new Properties(); - properties.load(new ClassPathResource("edu/wisc/uwss/local/local-users.properties").getInputStream()); - LocalUserDetailsManagerImpl service = new LocalUserDetailsManagerImpl(); - service.setDemoUsers(properties); + service.setLocalUserResource(new ClassPathResource("test-users.yaml")); service.init(); UWUserDetails userDetails = service.loadUserByUsername("admin"); @@ -80,92 +77,29 @@ public class LocalUserDetailsManagerImplTest { UWUserDetails jane = service.loadUserByUsername("jane"); assertEquals("UW000A001", jane.getPvi()); assertEquals("Jane Doe", jane.getFullName()); - + assertEquals("Loretta Doe", jane.getDisplayName()); + UWUserDetails john = service.loadUserByUsername("john"); - assertEquals("UW000A002", john.getPvi()); + assertEquals("UW000A004", john.getPvi()); assertEquals("John Doe", john.getFullName()); + assertEquals("Jack Doe", john.getDisplayName()); assertTrue(john.getUddsMembership().contains("A535005")); } - /** - * Confirm that {@link LocalUserDetailsManagerImpl} with {@link LocalUserDetailsManagerImpl#setLoaderEnabled(boolean)} - * of true results in equivalent {@link UWUserDetails} instances being loaded from JSON. - * - * Note: As of 1.5.x, this test passes, but potentially should not, as the {@link UWUserDetails} - * provided by the default {@link LocalUserDetailsAttributesMapper} do not have any - * {@link GrantedAuthority}, where the {@link UWUserDetails} provided by the - * {@link LocalUserDetailsLoader} do. See https://git.doit.wisc.edu/adi-ia/uw-spring-security/issues/5. - * - * @throws IOException - */ - @Test - 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")); - - } - /** - * Confirm that {@link LocalUserDetailsManagerImpl} with {@link LocalUserDetailsManagerImpl#setLoaderEnabled(boolean)} - * of true results in equivalent {@link UWUserDetails} instances being loaded from YAML. - * - * Note: As of 1.5.x, this test passes, but potentially should not, as the {@link UWUserDetails} - * provided by the default {@link LocalUserDetailsAttributesMapper} do not have any - * {@link GrantedAuthority}, where the {@link UWUserDetails} provided by the - * {@link LocalUserDetailsLoader} do. See https://git.doit.wisc.edu/adi-ia/uw-spring-security/issues/5. - * - * @throws IOException - */ - @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()); - - LocalUserDetailsManagerImpl withAttributesMapper = new LocalUserDetailsManagerImpl(); - withAttributesMapper.setDemoUsers(properties); - withAttributesMapper.init(); - - LocalUserDetailsManagerImpl withLoader = new LocalUserDetailsManagerImpl() - .setLocalUserResource(new ClassPathResource("edu/wisc/uwss/local/local-users.yaml")) - .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")); - } /** * Set up a properties instance including a user with a single UDDS. * Verify that value properly set in {@link UWUserDetails#getUddsMembership()}. */ @Test public void init_demoUsers_with_no_udds_and_no_control() { - Properties properties = new Properties(); - properties.put("test", "test,UW000A000,Nothing,Nothing,,foo@foo.wisc.edu"); - LocalUserDetailsManagerImpl service = new LocalUserDetailsManagerImpl(); - service.setDemoUsers(properties); + service.setLocalUserResource(new ClassPathResource("test-users.yaml")); service.init(); - UWUserDetails userDetails = service.loadUserByUsername("test"); + UWUserDetails userDetails = service.loadUserByUsername("testnoudds"); assertNotNull(userDetails); - assertEquals("UW000A000", userDetails.getPvi()); + assertEquals("UW000A003", userDetails.getPvi()); assertEquals("Nothing", userDetails.getFullName()); assertTrue(userDetails.getUddsMembership().isEmpty()); } @@ -175,18 +109,15 @@ public class LocalUserDetailsManagerImplTest { */ @Test public void init_demoUsers_with_single_udds() { - Properties properties = new Properties(); - properties.put("test", "test,UW000A000,Single UDDS,Single,UDDS,foo@foo.wisc.edu,A061234"); - LocalUserDetailsManagerImpl service = new LocalUserDetailsManagerImpl(); - service.setDemoUsers(properties); + service.setLocalUserResource(new ClassPathResource("test-users.yaml")); service.init(); - UWUserDetails userDetails = service.loadUserByUsername("test"); + UWUserDetails userDetails = service.loadUserByUsername("testsingleudds"); assertNotNull(userDetails); - assertEquals("UW000A000", userDetails.getPvi()); - assertEquals("Single UDDS", ((UWUserDetails) userDetails).getFullName()); - assertTrue(((UWUserDetails) userDetails).getUddsMembership().contains("A061234")); + assertEquals("UW000A002", userDetails.getPvi()); + assertEquals("Single UDDS", userDetails.getFullName()); + assertTrue(userDetails.getUddsMembership().contains("A535005")); } /** * Set up a properties instance including a user with multiple UDDS values. @@ -194,19 +125,16 @@ public class LocalUserDetailsManagerImplTest { */ @Test public void setDemoUsers_with_multiple_udds() { - Properties properties = new Properties(); - properties.put("test", "test,UW000A000,Multiple UDDS,Multiple,UDDS,foo@foo.wisc.edu,A061234,A061235,A061236"); - LocalUserDetailsManagerImpl service = new LocalUserDetailsManagerImpl(); - service.setDemoUsers(properties); + service.setLocalUserResource(new ClassPathResource("test-users.yaml")); service.init(); - UWUserDetails userDetails = service.loadUserByUsername("test"); + UWUserDetails userDetails = service.loadUserByUsername("testmultiudds"); assertNotNull(userDetails); - assertEquals("UW000A000", userDetails.getPvi()); + assertEquals("UW000B003", userDetails.getPvi()); assertEquals("Multiple UDDS", userDetails.getFullName()); - assertTrue(userDetails.getUddsMembership().contains("A061234")); - assertTrue(userDetails.getUddsMembership().contains("A061235")); + assertTrue(userDetails.getUddsMembership().contains("A535005")); + assertTrue(userDetails.getUddsMembership().contains("A535900")); assertTrue(userDetails.getUddsMembership().contains("A061236")); } @@ -368,13 +296,13 @@ public class LocalUserDetailsManagerImplTest { @Test public void unsupportedFormatWithUDDS() { - LocalUserDetailsAttributesMapper attributesMapper = new LocalUserDetailsAttributesMapper.Default(); + LocalUserDetailsLoader attributesMapper = new LocalUserDetailsLoader.Default(); + List<UWUserDetails> users = attributesMapper.loadUsers(new ClassPathResource("test-users.json")); + //demo STAR user with UDDS: - String row = "aalpaca,UW123D455,Amy Alpaca,amy.alpaca@demo.wisc.edu,A064079"; - String[] values = row.split(","); String username = "aalpaca"; - UWUserDetails uwUserDetails = attributesMapper.mapUser(username, values); + UWUserDetails uwUserDetails = users.get(0); assertEquals(username, uwUserDetails.getUsername()); assertEquals("aalpaca", uwUserDetails.getPassword()); assertEquals("UW123D455", uwUserDetails.getPvi()); @@ -386,13 +314,12 @@ public class LocalUserDetailsManagerImplTest { @Test public void unsupportedFormatWithoutUDDS() { - LocalUserDetailsAttributesMapper attributesMapper = new LocalUserDetailsAttributesMapper.Default(); + LocalUserDetailsLoader attributesMapper = new LocalUserDetailsLoader.Default(); + List<UWUserDetails> users = attributesMapper.loadUsers(new ClassPathResource("test-users.json")); //demo STAR user without UDDS: - String row = "jim,UW000A003,Jim Doe,jim.doe@demo.wisc.edu"; - String[] values = row.split(","); - String username = "aalpaca"; + String username = "jim"; - UWUserDetails uwUserDetails = attributesMapper.mapUser(username, values); + UWUserDetails uwUserDetails = users.get(1); assertEquals(username, uwUserDetails.getUsername()); assertEquals("jim", uwUserDetails.getPassword()); assertEquals("UW000A003", uwUserDetails.getPvi()); diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/NotHasModifiableSourceUWUserDetails.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/NotHasModifiableSourceUWUserDetails.java index 9f71f6a1689acb762ef29cc4462590cd5de57c98..9a11b70b51b4de7e5bab4f1c7844b8c49b4ec832 100644 --- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/NotHasModifiableSourceUWUserDetails.java +++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/local/NotHasModifiableSourceUWUserDetails.java @@ -63,6 +63,9 @@ final class NotHasModifiableSourceUWUserDetails implements UWUserDetails { @Override public String getFullName() { return null; } + @Override + public String getDisplayName() { return null; } + @Override public String getFirstName() { return null; } diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapperTest.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapperTest.java index 08aa10d075b1e826bd36c1e31391f0509cb9fe29..1ff6f2bf1652b77391b1eeddb3e78b46decdb366 100644 --- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapperTest.java +++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/PreauthenticatedUserDetailsAttributeMapperTest.java @@ -185,6 +185,7 @@ public class PreauthenticatedUserDetailsAttributeMapperTest { request.addHeader("wiscedupvi", "1234567"); request.addHeader("uid", "somebody"); request.addHeader("cn", "some body"); + request.addHeader("displayName", "some one"); request.addHeader("mail", "some.body@wisc.edu"); request.addHeader("wisceduisisemplid", "0000123456"); request.addHeader("Shib-Identity-Provider", "https://logintest.wisc.edu/idp/shibboleth"); @@ -200,6 +201,7 @@ public class PreauthenticatedUserDetailsAttributeMapperTest { assertEquals("somebody@wisc.edu", result.getEppn()); assertEquals("1234567", result.getPvi()); assertEquals("some body", result.getFullName()); + assertEquals("some one", result.getDisplayName()); assertEquals("some.body@wisc.edu", result.getEmailAddress()); assertEquals("0000123456", result.getIsisEmplid()); assertEquals("/Shibboleth.sso/Logout?return=https://logintest.wisc.edu/logout/", result.getCustomLogoutUrl()); diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/UWUserDetailsAuthenticationFilterTest.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/UWUserDetailsAuthenticationFilterTest.java index 324dbd62b36d611007b61fd30bebcab4565e3aac..5ce695073521fe312539b21572c67c449644afac 100644 --- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/UWUserDetailsAuthenticationFilterTest.java +++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/preauth/UWUserDetailsAuthenticationFilterTest.java @@ -36,6 +36,7 @@ public class UWUserDetailsAuthenticationFilterTest { when(request.getHeader("uid")).thenReturn("bbadger"); when(request.getHeader("eppn")).thenReturn("bbadger@wisc.edu"); when(request.getHeader("cn")).thenReturn("Bucky Badger"); + when(request.getHeader("displayName")).thenReturn("Buckingham Badger"); when(request.getHeaders("wisceduudds")).thenReturn(Collections.enumeration(Arrays.asList("A061234"))); when(request.getHeader("mail")).thenReturn("foo@foo.wisc.edu"); when(request.getHeader("isMemberOf")).thenReturn("somegroup"); @@ -43,6 +44,7 @@ public class UWUserDetailsAuthenticationFilterTest { assertEquals("bbadger", userDetails.getUsername()); assertEquals("bbadger@wisc.edu", userDetails.getEppn()); assertEquals("Bucky Badger", userDetails.getFullName()); + assertEquals("Buckingham Badger", userDetails.getDisplayName()); assertEquals("foo@foo.wisc.edu", userDetails.getEmailAddress()); assertEquals(1, userDetails.getUddsMembership().size()); assertEquals("A061234", userDetails.getUddsMembership().iterator().next()); @@ -59,10 +61,12 @@ public class UWUserDetailsAuthenticationFilterTest { HttpServletRequest request = mock(HttpServletRequest.class); when(request.getHeader("uid")).thenReturn("bbadger"); + when(request.getHeader("displayName")).thenReturn("Buckingham Badger"); when(request.getHeader("cn")).thenReturn("Bucky Badger"); UWUserDetails userDetails = filter.getPreAuthenticatedPrincipal(request); assertEquals("bbadger", userDetails.getUsername()); assertEquals("Bucky Badger", userDetails.getFullName()); + assertEquals("Buckingham Badger", userDetails.getDisplayName()); assertTrue(userDetails.getUddsMembership().isEmpty()); } /** @@ -76,10 +80,12 @@ public class UWUserDetailsAuthenticationFilterTest { HttpServletRequest request = mock(HttpServletRequest.class); when(request.getHeader("uid")).thenReturn("bbadger"); - when(request.getHeader("cn")).thenReturn("Bucky Badger"); + when(request.getHeader("displayName")).thenReturn("Buckingham Badger"); + when(request.getHeader("cn")).thenReturn("Bucky Badger"); UWUserDetails userDetails = filter.getPreAuthenticatedPrincipal(request); assertEquals("bbadger", userDetails.getUsername()); - assertEquals("Bucky Badger", userDetails.getFullName()); + assertEquals("Bucky Badger", userDetails.getFullName()); + assertEquals("Buckingham Badger", userDetails.getDisplayName()); assertTrue(userDetails.getAuthorities().isEmpty()); } /** diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/IdentifiersBuilderTest.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/IdentifiersBuilderTest.java index fc4a782707a8a2b38ae1d7f8d407cccaaf2a0f3c..8963a04ee11661e1d49ba48cc329affdc61af0be 100644 --- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/IdentifiersBuilderTest.java +++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/IdentifiersBuilderTest.java @@ -2,8 +2,8 @@ package edu.wisc.uwss.uds; import org.junit.Test; -import edu.wisc.services.uds.person.v1_1.Identifier; -import edu.wisc.services.uds.person.v1_1.Identifiers; +import edu.wisc.uds.person.Identifier; +import edu.wisc.uds.person.Identifiers; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImplTest.java b/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImplTest.java index 9397790a0aa4263628e8cc56a7a48aa6a091a094..c949209aa6642bc8ff3361f482b475c29e5145a2 100644 --- a/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImplTest.java +++ b/uw-spring-security-core/src/test/java/edu/wisc/uwss/uds/UdsPersonUserDetailsImplTest.java @@ -9,11 +9,11 @@ import java.util.Collections; import org.junit.Test; -import edu.wisc.services.uds.person.v1_1.Demographic; -import edu.wisc.services.uds.person.v1_1.Identifier; -import edu.wisc.services.uds.person.v1_1.Identifiers; -import edu.wisc.services.uds.person.v1_1.Name; -import edu.wisc.services.uds.person.v1_1.Person; +import edu.wisc.uds.person.Demographic; +import edu.wisc.uds.person.Identifier; +import edu.wisc.uds.person.Identifiers; +import edu.wisc.uds.person.Name; +import edu.wisc.uds.person.Person; /** * Tests for {@link UdsPersonUserDetailsImpl} @@ -43,6 +43,7 @@ public class UdsPersonUserDetailsImplTest { assertNull(userDetails.getCustomLogoutUrl()); assertNull(userDetails.getEmailAddress()); assertNull(userDetails.getFullName()); + assertNull(userDetails.getDisplayName()); assertNull(userDetails.getPassword()); assertNull(userDetails.getPvi()); assertEquals(UdsPersonUserDetailsImpl.USER_DETAILS_SOURCE, userDetails.getSource()); @@ -138,5 +139,21 @@ public class UdsPersonUserDetailsImplTest { assertEquals(pvi, new UdsPersonUserDetailsImpl(person).getPvi()); } + /** + * Confirm successfully retrieve {@link UdsPersonUserDetailsImpl#getDisplayName()}, + * that it uses preferred name, and also overrides the given name. + */ + @Test + public void getDisplayName_control() { + Person person = new Person(); + Demographic demographic = new Demographic(); + Name name = new Name(); + name.setLast("Badger"); + name.setFirst("Bucky"); + name.setPreferredFirst("Buckingham"); + demographic.setName(name); + person.setDemographic(demographic); + assertEquals("Buckingham Badger", new UdsPersonUserDetailsImpl(person).getDisplayName()); + } } diff --git a/uw-spring-security-core/src/test/resources/test-users.json b/uw-spring-security-core/src/test/resources/test-users.json new file mode 100644 index 0000000000000000000000000000000000000000..e9299272e924d389499572976b50084ff5081318 --- /dev/null +++ b/uw-spring-security-core/src/test/resources/test-users.json @@ -0,0 +1,24 @@ +[ + { + "username": "aalpaca", + "password": "aalpaca", + "fullName": "Amy Alpaca", + "firstName": "Amy", + "lastName": "Alpaca", + "emailAddress": "amy.alpaca@demo.wisc.edu", + "pvi": "UW123D455", + "uddsMembership": [ "A064079" ], + "authorities": [] + }, + { + "username": "jim", + "password": "jim", + "fullName": "Jim Doe", + "firstName": "Jim", + "lastName": "Doe", + "emailAddress": "jim.doe@demo.wisc.edu", + "pvi": "UW000A003", + "uddsMembership": [ ], + "authorities": [] + } +] \ No newline at end of file diff --git a/uw-spring-security-core/src/test/resources/test-users.yaml b/uw-spring-security-core/src/test/resources/test-users.yaml new file mode 100644 index 0000000000000000000000000000000000000000..df94f2e631d4cf0fded22a5c4eea7823fd8665e2 --- /dev/null +++ b/uw-spring-security-core/src/test/resources/test-users.yaml @@ -0,0 +1,62 @@ +--- +- pvi: "UW000A000" + username: "admin" + password: "admin" + fullName: "Amy Administrator" + emailAddress: "amy.administrator@demo.wisc.edu" + uddsMembership: + - "A535900" + authorities: + - "edu.wisc.uwss.local.administrator" + firstName: "Amy" + lastName: "Administrator" +- pvi: "UW000A001" + username: "jane" + password: "jane" + fullName: "Jane Doe" + displayName: "Loretta Doe" + emailAddress: "jane.doe@demo.wisc.edu" + uddsMembership: + - "A535005" + authorities: [] + firstName: "John" + lastName: "Doe" +- pvi: "UW000A004" + username: "john" + password: "john" + fullName: "John Doe" + displayName: "Jack Doe" + emailAddress: "john.doe@demo.wisc.edu" + uddsMembership: + - "A535005" + authorities: [] + firstName: "John" + lastName: "Doe" +- pvi: "UW000A002" + username: "testsingleudds" + password: "john" + fullName: "Single UDDS" + emailAddress: "john.doe@demo.wisc.edu" + uddsMembership: + - "A535005" + authorities: [] + firstName: "John" + lastName: "Doe" +- pvi: "UW000A003" + username: "testnoudds" + password: "jim123" + fullName: "Nothing" + emailAddress: "jim.doe@demo.wisc.edu" + uddsMembership: [] + authorities: [] + firstName: "Jim" + lastName: "Doe" +- pvi: "UW000B003" + username: "testmultiudds" + password: "udds1" + fullName: "Multiple UDDS" + emailAddress: "multi.udds@demo.wisc.edu" + uddsMembership: ["A535005","A535900","A061236"] + authorities: [] + firstName: "Test" + lastName: "Multi" \ No newline at end of file diff --git a/uw-spring-security-sample-war/pom.xml b/uw-spring-security-sample-war/pom.xml index 1acbabda22592cfb2ffcde828c5885d530ce9ca0..44a82e31b2ff71d61dba8cd040235e2bec8dd094 100644 --- a/uw-spring-security-sample-war/pom.xml +++ b/uw-spring-security-sample-war/pom.xml @@ -3,7 +3,7 @@ <parent> <groupId>edu.wisc.uwss</groupId> <artifactId>uw-spring-security</artifactId> - <version>1.7.1-SNAPSHOT</version> + <version>2.0.0-SNAPSHOT</version> </parent> <artifactId>uw-spring-security-sample-war</artifactId> <name>UW Spring Security Sample War</name> diff --git a/uw-spring-security-sample-war/src/main/resources/edu/wisc/uwss/configuration/sample-war.properties b/uw-spring-security-sample-war/src/main/resources/edu/wisc/uwss/configuration/sample-war.properties index 493481b3cc283a20d70c505ca5ef438b9c769ea7..4c6f93553a38c351114ecb8f9ebc5cbce477e80b 100644 --- a/uw-spring-security-sample-war/src/main/resources/edu/wisc/uwss/configuration/sample-war.properties +++ b/uw-spring-security-sample-war/src/main/resources/edu/wisc/uwss/configuration/sample-war.properties @@ -1,2 +1 @@ -edu.wisc.uwss.local.userDetailsLoader.enabled=true edu.wisc.uwss.local.userDetailsLoader.resource=classpath:/edu/wisc/uwss/local/local-users.yaml \ No newline at end of file diff --git a/uw-spring-security-web/pom.xml b/uw-spring-security-web/pom.xml index b7cff5dd26cc5577855d1f283a1ad5c9e9ca5f5d..4c6eedf84af3bfa43b89c83bf899f636fbef6843 100644 --- a/uw-spring-security-web/pom.xml +++ b/uw-spring-security-web/pom.xml @@ -3,7 +3,7 @@ <parent> <groupId>edu.wisc.uwss</groupId> <artifactId>uw-spring-security</artifactId> - <version>1.7.1-SNAPSHOT</version> + <version>2.0.0-SNAPSHOT</version> </parent> <artifactId>uw-spring-security-web</artifactId> <name>UW Spring Security Web</name> diff --git a/uw-spring-security-web/src/main/java/edu/wisc/uwss/web/uwframe/UwframeSession.java b/uw-spring-security-web/src/main/java/edu/wisc/uwss/web/uwframe/UwframeSession.java index 665f5bacbd4f9783f0d761821c27601a92a715b6..0e61c6e4ae3e9db4ebb465a0923cf461492545ec 100644 --- a/uw-spring-security-web/src/main/java/edu/wisc/uwss/web/uwframe/UwframeSession.java +++ b/uw-spring-security-web/src/main/java/edu/wisc/uwss/web/uwframe/UwframeSession.java @@ -60,7 +60,8 @@ public class UwframeSession { * @param userDetails */ public UwframeSession(Environment environment, UWUserDetails userDetails) { - this(environment, userDetails.getUsername(), userDetails.getFullName(), userDetails.getFirstName(), userDetails.getLastName()); + this(environment, userDetails.getUsername(), userDetails.getDisplayName()!=null ? userDetails.getDisplayName() : userDetails.getFullName(), + userDetails.getFirstName(), userDetails.getLastName()); } /** *