diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/saml/SamlBindingTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/saml/SamlBindingTest.java index 8f8f2b492f..b6adb0153f 100755 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/saml/SamlBindingTest.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/saml/SamlBindingTest.java @@ -10,14 +10,18 @@ import org.keycloak.Config; import org.keycloak.models.ApplicationModel; import org.keycloak.models.Constants; import org.keycloak.models.KeycloakSession; +import org.keycloak.models.ProtocolMapperModel; import org.keycloak.models.RealmModel; import org.keycloak.models.UserModel; import org.keycloak.models.UserSessionModel; import org.keycloak.protocol.oidc.TokenManager; +import org.keycloak.protocol.saml.mappers.AttributeStatementHelper; +import org.keycloak.protocol.saml.mappers.SAMLBasicRoleListMapper; import org.keycloak.representations.AccessToken; import org.keycloak.services.managers.RealmManager; import org.keycloak.services.resources.admin.AdminRoot; import org.keycloak.testsuite.pages.LoginPage; +import org.keycloak.testsuite.rule.KeycloakRule; import org.keycloak.testsuite.rule.WebResource; import org.keycloak.testsuite.rule.WebRule; import org.openqa.selenium.WebDriver; @@ -101,10 +105,12 @@ public class SamlBindingTest { private void handler(HttpServletRequest req, HttpServletResponse resp) { System.out.println("********* HERE ******"); if (req.getParameterMap().isEmpty()) { + System.out.println("redirecting"); resp.setStatus(302); resp.setHeader("Location", "http://localhost:8081/auth/realms/demo/protocol/saml?SAMLRequest=jVJbT8IwFP4rS99HuwluNIwEIUYSLwugD76Y2h2kSdfOng7l31uGRn0ATfrQ9HznfJfTEYpaN3zS%2Bo1ZwGsL6KP3WhvkXaEgrTPcClTIjagBuZd8Obm55mmP8cZZb6XV5NByGiwQwXllDYkmX9epNdjW4JbgtkrC%2FeK6IBvvG06ptlLojUXPc5YnFOpG2x0AJdEsaFRG7PuPoUWwQx0IXSOtoLb0SynduyLRpXUSOs8FWQuNQKL5rCDz2VO%2FymEgIY2zlJ3H%2FSx9jkU%2BzOK0ys8yNmSSsUEAYxnsqC18tyO2MDfohfEFSVkyiNlZzM5XacrDSbJePug%2Fkqj8FHKhTKXMy%2BnIng8g5FerVRmXd8sViR7AYec8AMh4tPfDO3L3Y2%2F%2F3cT4j7BH9Mf8A1nDb8PA%2Bay0WsldNNHavk1D1D5k4V0LXbi18MclJL2ke1FVvO6gvDXYgFRrBRWh4wPp7z85%2FgA%3D"); return; } + System.out.println("received response"); samlResponse = req.getParameter("SAMLResponse"); } } @@ -199,42 +205,108 @@ public class SamlBindingTest { // this test has a hardcoded SAMLRequest and we hack a SP face servlet to get the SAMLResponse so we can look // at the assertions sent. This is because Picketlink, AFAICT, does not give you any way to get access to // the assertion. - SamlSPFacade.samlResponse = null; - driver.navigate().to("http://localhost:8081/employee/"); - Assert.assertTrue(driver.getCurrentUrl().startsWith("http://localhost:8081/auth/realms/demo/protocol/saml")); - System.out.println(driver.getCurrentUrl()); - loginPage.login("bburke", "password"); - Assert.assertEquals(driver.getCurrentUrl(), "http://localhost:8081/employee/"); - Assert.assertNotNull(SamlSPFacade.samlResponse); - SAML2Response saml2Response = new SAML2Response(); - byte[] samlResponse = PostBindingUtil.base64Decode(SamlSPFacade.samlResponse); - ResponseType rt = saml2Response.getResponseType(new ByteArrayInputStream(samlResponse)); - Assert.assertTrue(rt.getAssertions().size() == 1); - AssertionType assertion = rt.getAssertions().get(0).getAssertion(); - // test attributes + { + SamlSPFacade.samlResponse = null; + driver.navigate().to("http://localhost:8081/employee/"); + Assert.assertTrue(driver.getCurrentUrl().startsWith("http://localhost:8081/auth/realms/demo/protocol/saml")); + System.out.println(driver.getCurrentUrl()); + loginPage.login("bburke", "password"); + Assert.assertEquals(driver.getCurrentUrl(), "http://localhost:8081/employee/"); + Assert.assertNotNull(SamlSPFacade.samlResponse); + SAML2Response saml2Response = new SAML2Response(); + byte[] samlResponse = PostBindingUtil.base64Decode(SamlSPFacade.samlResponse); + ResponseType rt = saml2Response.getResponseType(new ByteArrayInputStream(samlResponse)); + Assert.assertTrue(rt.getAssertions().size() == 1); + AssertionType assertion = rt.getAssertions().get(0).getAssertion(); - boolean email = false; - boolean phone = false; - for (AttributeStatementType statement : assertion.getAttributeStatements()) { - for (AttributeStatementType.ASTChoiceType choice : statement.getAttributes()) { - AttributeType attr = choice.getAttribute(); - if (X500SAMLProfileConstants.EMAIL.getFriendlyName().equals(attr.getFriendlyName())) { - Assert.assertEquals(X500SAMLProfileConstants.EMAIL.get(), attr.getName()); - Assert.assertEquals(JBossSAMLURIConstants.ATTRIBUTE_FORMAT_URI.get(), attr.getNameFormat()); - Assert.assertEquals(attr.getAttributeValue().get(0), "bburke@redhat.com"); - email = true; - } else if (attr.getName().equals("phone")) { - Assert.assertEquals(JBossSAMLURIConstants.ATTRIBUTE_FORMAT_BASIC.get(), attr.getNameFormat()); - Assert.assertEquals(attr.getAttributeValue().get(0), "617"); - phone = true; + // test attributes and roles + + boolean email = false; + boolean phone = false; + boolean userRole = false; + boolean managerRole = false; + for (AttributeStatementType statement : assertion.getAttributeStatements()) { + for (AttributeStatementType.ASTChoiceType choice : statement.getAttributes()) { + AttributeType attr = choice.getAttribute(); + if (X500SAMLProfileConstants.EMAIL.getFriendlyName().equals(attr.getFriendlyName())) { + Assert.assertEquals(X500SAMLProfileConstants.EMAIL.get(), attr.getName()); + Assert.assertEquals(JBossSAMLURIConstants.ATTRIBUTE_FORMAT_URI.get(), attr.getNameFormat()); + Assert.assertEquals(attr.getAttributeValue().get(0), "bburke@redhat.com"); + email = true; + } else if (attr.getName().equals("phone")) { + Assert.assertEquals(JBossSAMLURIConstants.ATTRIBUTE_FORMAT_BASIC.get(), attr.getNameFormat()); + Assert.assertEquals(attr.getAttributeValue().get(0), "617"); + phone = true; + } else if (attr.getName().equals("Role")) { + if (attr.getAttributeValue().get(0).equals("manager")) managerRole = true; + if (attr.getAttributeValue().get(0).equals("user")) userRole = true; + } } + } + Assert.assertTrue(email); + Assert.assertTrue(phone); + Assert.assertTrue(userRole); + Assert.assertTrue(managerRole); } - Assert.assertTrue(email); - Assert.assertTrue(phone); + keycloakRule.update(new KeycloakRule.KeycloakSetup() { + @Override + public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) { + ApplicationModel app = appRealm.getApplicationByName("http://localhost:8081/employee/"); + for (ProtocolMapperModel mapper : app.getProtocolMappers()) { + if (mapper.getName().equals("role-list")) { + app.removeProtocolMapper(mapper); + mapper.setId(null); + mapper.getConfig().put(SAMLBasicRoleListMapper.SINGLE_ROLE_ATTRIBUTE, "true"); + mapper.getConfig().put(AttributeStatementHelper.SAML_ATTRIBUTE_NAME, "memberOf"); + app.addProtocolMapper(mapper); + } + } + } + }, "demo"); + + System.out.println(">>>>>>>>>> single role attribute <<<<<<<<"); + + { + SamlSPFacade.samlResponse = null; + driver.navigate().to("http://localhost:8081/employee/"); + System.out.println(driver.getCurrentUrl()); + Assert.assertEquals(driver.getCurrentUrl(), "http://localhost:8081/employee/"); + Assert.assertNotNull(SamlSPFacade.samlResponse); + SAML2Response saml2Response = new SAML2Response(); + byte[] samlResponse = PostBindingUtil.base64Decode(SamlSPFacade.samlResponse); + ResponseType rt = saml2Response.getResponseType(new ByteArrayInputStream(samlResponse)); + Assert.assertTrue(rt.getAssertions().size() == 1); + AssertionType assertion = rt.getAssertions().get(0).getAssertion(); + + // test attributes and roles + + boolean userRole = false; + boolean managerRole = false; + boolean single = false; + for (AttributeStatementType statement : assertion.getAttributeStatements()) { + for (AttributeStatementType.ASTChoiceType choice : statement.getAttributes()) { + AttributeType attr = choice.getAttribute(); + if (attr.getName().equals("memberOf")) { + if (single) Assert.fail("too many role attributes"); + single = true; + for (Object value : attr.getAttributeValue()) { + if (value.equals("manager")) managerRole = true; + if (value.equals("user")) userRole = true; + } + } + } + + } + + Assert.assertTrue(userRole); + Assert.assertTrue(managerRole); + } + + }