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 d638e04075da426a5537d972219d220f7eb9ed8b..20bf725c149d3445327b18559c6a28c2c90a775e 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 @@ -60,6 +60,7 @@ public interface PreauthenticatedUserDetailsAttributeMapper { private String identityProviderHeader = "Shib-Identity-Provider"; private String customLogoutPrefix = "/Shibboleth.sso/Logout?return="; private String customLogoutSuffix = "/logout/"; + private String manifestHeader = "ismemberof"; private static final Logger logger = LoggerFactory.getLogger(Default.class); /** @@ -87,7 +88,12 @@ public interface PreauthenticatedUserDetailsAttributeMapper { uddsMembership = Collections.list(uddsHeaders); } String email = request.getHeader(emailAddressHeader); - UWUserDetailsImpl result = new UWUserDetailsImpl(pvi, uid, "", cn, email, uddsMembership); + Collection<String> manifestGroups = new ArrayList<>(); + Enumeration<String> manifestHeaders = request.getHeaders(manifestHeader); + if(manifestHeaders != null) { + manifestGroups = Collections.list(manifestHeaders); + } + UWUserDetailsImpl result = UWUserDetailsImpl.newInstance(pvi, uid, "", cn, email, uddsMembership, manifestGroups); result.setSource("edu.wisc.uwss.preauth"); result.setEppn(eppn); result.setIsisEmplid(emplid); @@ -280,5 +286,18 @@ public interface PreauthenticatedUserDetailsAttributeMapper { public void setLastNameHeader(String lastNameHeader) { this.lastNameHeader = lastNameHeader; } + /** + * @return the manifestHeader + */ + public String getManifestHeader() { + return manifestHeader; + } + /** + * @param manifestHeader the manifestHeader to set + */ + @Value("${preauth.manifestHeader:ismemberof}") + public void setManifestHeader(String manifestHeader) { + this.manifestHeader = manifestHeader; + } } } 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 92b4b0d4ca80c85dd562739d70f4b2ae9572a8c0..e387848a7ebe07e448d0de40e5c927576a65993e 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 @@ -6,6 +6,7 @@ package edu.wisc.uwss.preauth; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.net.URL; import java.util.Collections; @@ -41,6 +42,7 @@ public class PreauthenticatedUserDetailsAttributeMapperTest { String email = "some.body@wisc.edu"; String emplid = "0000123456"; List<String> uddsMembership = Collections.singletonList("udds1234"); + List<String> manifestGroups = Collections.singletonList("uw:domain:something"); request.addHeader("eppn", eppn); request.addHeader("wiscedupvi", pvi); @@ -50,6 +52,7 @@ public class PreauthenticatedUserDetailsAttributeMapperTest { request.addHeader("wisceduudds", uddsMembership); request.addHeader("wisceduisisemplid", emplid); request.addHeader("Shib-Identity-Provider", "https://logintest.wisc.edu/idp/shibboleth"); + request.addHeader("ismemberof",manifestGroups); UWUserDetails result = filter.mapUser(request); @@ -62,6 +65,8 @@ public class PreauthenticatedUserDetailsAttributeMapperTest { assertEquals(uddsMembership, result.getUddsMembership()); assertEquals(emplid, result.getIsisEmplid()); assertEquals("/Shibboleth.sso/Logout?return=https://logintest.wisc.edu/logout/", result.getCustomLogoutUrl()); + assertEquals(1,result.getAuthorities().size()); + assertEquals(manifestGroups.toString(),result.getAuthorities().toString()); } /** 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 2ab93b5ec7d2eb614ee8cdf842f3d2b39c2ab0d5..edce2a8062b045b9a0cfea86ed7c4ff12b2a4435 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 @@ -63,7 +63,24 @@ public class UWUserDetailsAuthenticationFilterTest { assertEquals("Bucky Badger", userDetails.getFullName()); assertTrue(userDetails.getUddsMembership().isEmpty()); } - /** + /** + * Verify behavior for {@link UWUserDetailsAuthenticationFilter#getPreAuthenticatedPrincipal(HttpServletRequest)} + * when no "manifest" header is present, which is commonly true unless an the application is designed + * specifically to consume a manifest group. + */ + @Test + public void getPreAuthenticatedPrincipal_no_manifestgroups() { + UWUserDetailsAuthenticationFilter filter = new UWUserDetailsAuthenticationFilter(); + HttpServletRequest request = mock(HttpServletRequest.class); + + when(request.getHeader("uid")).thenReturn("bbadger"); + when(request.getHeader("cn")).thenReturn("Bucky Badger"); + UWUserDetails userDetails = filter.getPreAuthenticatedPrincipal(request); + assertEquals("bbadger", userDetails.getUsername()); + assertEquals("Bucky Badger", userDetails.getFullName()); + assertTrue(userDetails.getAuthorities().isEmpty()); + } + /** * Verify behavior for {@link UWUserDetailsAuthenticationFilter#getPreAuthenticatedPrincipal(HttpServletRequest)} when * no "uid" header is present. This would represent a scenario where our pre-authentication (shib) environment isn't correctly * configured; we want to make sure attempts to login would fail and not accidentially leak people in.