Repository: cxf Updated Branches: refs/heads/master 30ac7940b -> e0bbfe4a0
Add the ability to set a custom claim type in the generated token Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/e0bbfe4a Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/e0bbfe4a Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/e0bbfe4a Branch: refs/heads/master Commit: e0bbfe4a0c8a17c2335d08aec558c98fdebbf07d Parents: 30ac794 Author: Colm O hEigeartaigh <[email protected]> Authored: Tue Jul 11 13:11:49 2017 +0100 Committer: Colm O hEigeartaigh <[email protected]> Committed: Tue Jul 11 13:12:44 2017 +0100 ---------------------------------------------------------------------- .../sts/rest/RESTSecurityTokenServiceImpl.java | 1 + .../provider/jwt/DefaultJWTClaimsProvider.java | 23 +++++- .../cxf/sts/token/provider/JWTClaimsTest.java | 75 ++++++++++++++++++++ .../cxf/systest/sts/rest/STSRESTTest.java | 7 +- .../cxf/systest/sts/rest/cxf-rest-sts.xml | 7 ++ 5 files changed, 108 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/e0bbfe4a/services/sts/sts-core/src/main/java/org/apache/cxf/sts/rest/RESTSecurityTokenServiceImpl.java ---------------------------------------------------------------------- diff --git a/services/sts/sts-core/src/main/java/org/apache/cxf/sts/rest/RESTSecurityTokenServiceImpl.java b/services/sts/sts-core/src/main/java/org/apache/cxf/sts/rest/RESTSecurityTokenServiceImpl.java index 16b715c..b9c0030 100644 --- a/services/sts/sts-core/src/main/java/org/apache/cxf/sts/rest/RESTSecurityTokenServiceImpl.java +++ b/services/sts/sts-core/src/main/java/org/apache/cxf/sts/rest/RESTSecurityTokenServiceImpl.java @@ -77,6 +77,7 @@ public class RESTSecurityTokenServiceImpl extends SecurityTokenServiceImpl imple DEFAULT_CLAIM_TYPE_MAP = new HashMap<>(); DEFAULT_CLAIM_TYPE_MAP.put("emailaddress", CLAIM_TYPE_NS + "/claims/emailaddress"); DEFAULT_CLAIM_TYPE_MAP.put("role", CLAIM_TYPE_NS + "/claims/role"); + DEFAULT_CLAIM_TYPE_MAP.put("roles", CLAIM_TYPE_NS + "/claims/role"); DEFAULT_CLAIM_TYPE_MAP.put("surname", CLAIM_TYPE_NS + "/claims/surname"); DEFAULT_CLAIM_TYPE_MAP.put("givenname", CLAIM_TYPE_NS + "/claims/givenname"); DEFAULT_CLAIM_TYPE_MAP.put("name", CLAIM_TYPE_NS + "/claims/name"); http://git-wip-us.apache.org/repos/asf/cxf/blob/e0bbfe4a/services/sts/sts-core/src/main/java/org/apache/cxf/sts/token/provider/jwt/DefaultJWTClaimsProvider.java ---------------------------------------------------------------------- diff --git a/services/sts/sts-core/src/main/java/org/apache/cxf/sts/token/provider/jwt/DefaultJWTClaimsProvider.java b/services/sts/sts-core/src/main/java/org/apache/cxf/sts/token/provider/jwt/DefaultJWTClaimsProvider.java index 92c7b32b..09fa265 100644 --- a/services/sts/sts-core/src/main/java/org/apache/cxf/sts/token/provider/jwt/DefaultJWTClaimsProvider.java +++ b/services/sts/sts-core/src/main/java/org/apache/cxf/sts/token/provider/jwt/DefaultJWTClaimsProvider.java @@ -26,6 +26,7 @@ import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.logging.Logger; @@ -61,6 +62,7 @@ public class DefaultJWTClaimsProvider implements JWTClaimsProvider { private boolean failLifetimeExceedance = true; private boolean acceptClientLifetime; private long futureTimeToLive = 60L; + private Map<String, String> claimTypeMap; /** * Get a JwtClaims object. @@ -159,7 +161,7 @@ public class DefaultJWTClaimsProvider implements JWTClaimsProvider { if (claim.getValues().size() == 1) { claimValues = claim.getValues().get(0); } - claims.setProperty(claim.getClaimType().toString(), claimValues); + claims.setProperty(translateClaim(claim.getClaimType().toString()), claimValues); } } } @@ -276,6 +278,13 @@ public class DefaultJWTClaimsProvider implements JWTClaimsProvider { } } + private String translateClaim(String claimType) { + if (claimTypeMap == null || !claimTypeMap.containsKey(claimType)) { + return claimType; + } + return claimTypeMap.get(claimType); + } + public boolean isUseX500CN() { return useX500CN; } @@ -365,4 +374,16 @@ public class DefaultJWTClaimsProvider implements JWTClaimsProvider { this.failLifetimeExceedance = failLifetimeExceedance; } + public Map<String, String> getClaimTypeMap() { + return claimTypeMap; + } + + /** + * Specify a way to map ClaimType URIs to custom ClaimTypes + * @param claimTypeMap + */ + public void setClaimTypeMap(Map<String, String> claimTypeMap) { + this.claimTypeMap = claimTypeMap; + } + } http://git-wip-us.apache.org/repos/asf/cxf/blob/e0bbfe4a/services/sts/sts-core/src/test/java/org/apache/cxf/sts/token/provider/JWTClaimsTest.java ---------------------------------------------------------------------- diff --git a/services/sts/sts-core/src/test/java/org/apache/cxf/sts/token/provider/JWTClaimsTest.java b/services/sts/sts-core/src/test/java/org/apache/cxf/sts/token/provider/JWTClaimsTest.java index a758d4c..f11421a 100644 --- a/services/sts/sts-core/src/test/java/org/apache/cxf/sts/token/provider/JWTClaimsTest.java +++ b/services/sts/sts-core/src/test/java/org/apache/cxf/sts/token/provider/JWTClaimsTest.java @@ -40,6 +40,7 @@ import org.apache.cxf.sts.common.PasswordCallbackHandler; import org.apache.cxf.sts.request.KeyRequirements; import org.apache.cxf.sts.request.TokenRequirements; import org.apache.cxf.sts.service.EncryptionProperties; +import org.apache.cxf.sts.token.provider.jwt.DefaultJWTClaimsProvider; import org.apache.cxf.sts.token.provider.jwt.JWTTokenProvider; import org.apache.wss4j.common.crypto.Crypto; import org.apache.wss4j.common.crypto.CryptoFactory; @@ -211,6 +212,80 @@ public class JWTClaimsTest extends org.junit.Assert { assertEquals(jwt.getClaim(CLAIM_STATIC_COMPANY.toString()), CLAIM_STATIC_COMPANY_VALUE); } + @org.junit.Test + public void testJWTRoleUsingURI() throws Exception { + TokenProvider tokenProvider = new JWTTokenProvider(); + TokenProviderParameters providerParameters = + createProviderParameters(JWTTokenProvider.JWT_TOKEN_TYPE, null); + + ClaimsManager claimsManager = new ClaimsManager(); + ClaimsHandler claimsHandler = new CustomClaimsHandler(); + claimsManager.setClaimHandlers(Collections.singletonList(claimsHandler)); + providerParameters.setClaimsManager(claimsManager); + + ClaimCollection claims = new ClaimCollection(); + + URI role = URI.create("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/role"); + + Claim claim = new Claim(); + claim.setClaimType(role); + claims.add(claim); + + providerParameters.setRequestedPrimaryClaims(claims); + + assertTrue(tokenProvider.canHandleToken(JWTTokenProvider.JWT_TOKEN_TYPE)); + TokenProviderResponse providerResponse = tokenProvider.createToken(providerParameters); + assertTrue(providerResponse != null); + assertTrue(providerResponse.getToken() != null && providerResponse.getTokenId() != null); + + String token = (String)providerResponse.getToken(); + assertNotNull(token); + + JwsJwtCompactConsumer jwtConsumer = new JwsJwtCompactConsumer(token); + JwtToken jwt = jwtConsumer.getJwtToken(); + assertEquals(jwt.getClaim(role.toString()), "DUMMY"); + } + + @org.junit.Test + public void testJWTRoleUsingCustomReturnType() throws Exception { + TokenProvider tokenProvider = new JWTTokenProvider(); + TokenProviderParameters providerParameters = + createProviderParameters(JWTTokenProvider.JWT_TOKEN_TYPE, null); + + ClaimsManager claimsManager = new ClaimsManager(); + ClaimsHandler claimsHandler = new CustomClaimsHandler(); + claimsManager.setClaimHandlers(Collections.singletonList(claimsHandler)); + providerParameters.setClaimsManager(claimsManager); + + ClaimCollection claims = new ClaimCollection(); + + URI role = URI.create("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/role"); + + Claim claim = new Claim(); + claim.setClaimType(role); + claims.add(claim); + + providerParameters.setRequestedPrimaryClaims(claims); + + Map<String, String> claimTypeMap = new HashMap<>(); + claimTypeMap.put(role.toString(), "roles"); + DefaultJWTClaimsProvider claimsProvider = new DefaultJWTClaimsProvider(); + claimsProvider.setClaimTypeMap(claimTypeMap); + ((JWTTokenProvider)tokenProvider).setJwtClaimsProvider(claimsProvider); + + assertTrue(tokenProvider.canHandleToken(JWTTokenProvider.JWT_TOKEN_TYPE)); + TokenProviderResponse providerResponse = tokenProvider.createToken(providerParameters); + assertTrue(providerResponse != null); + assertTrue(providerResponse.getToken() != null && providerResponse.getTokenId() != null); + + String token = (String)providerResponse.getToken(); + assertNotNull(token); + + JwsJwtCompactConsumer jwtConsumer = new JwsJwtCompactConsumer(token); + JwtToken jwt = jwtConsumer.getJwtToken(); + assertEquals(jwt.getClaim("roles"), "DUMMY"); + } + private TokenProviderParameters createProviderParameters( String tokenType, String appliesTo ) throws WSSecurityException { http://git-wip-us.apache.org/repos/asf/cxf/blob/e0bbfe4a/services/sts/systests/basic/src/test/java/org/apache/cxf/systest/sts/rest/STSRESTTest.java ---------------------------------------------------------------------- diff --git a/services/sts/systests/basic/src/test/java/org/apache/cxf/systest/sts/rest/STSRESTTest.java b/services/sts/systests/basic/src/test/java/org/apache/cxf/systest/sts/rest/STSRESTTest.java index cb04f82..b7d3177 100644 --- a/services/sts/systests/basic/src/test/java/org/apache/cxf/systest/sts/rest/STSRESTTest.java +++ b/services/sts/systests/basic/src/test/java/org/apache/cxf/systest/sts/rest/STSRESTTest.java @@ -937,11 +937,10 @@ public class STSRESTTest extends AbstractBusClientServerTestBase { JwsJwtCompactConsumer jwtConsumer = new JwsJwtCompactConsumer(token); JwtToken jwt = jwtConsumer.getJwtToken(); - String role = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/role"; - assertTrue(jwt.getClaim(role) == null); + assertTrue(jwt.getClaim("roles") == null); // Now get another token specifying the role - client.query("claim", role); + client.query("claim", "roles"); response = client.get(); token = response.readEntity(String.class); @@ -952,7 +951,7 @@ public class STSRESTTest extends AbstractBusClientServerTestBase { jwtConsumer = new JwsJwtCompactConsumer(token); jwt = jwtConsumer.getJwtToken(); - assertEquals("ordinary-user", jwt.getClaim(role)); + assertEquals("ordinary-user", jwt.getClaim("roles")); bus.shutdown(true); } http://git-wip-us.apache.org/repos/asf/cxf/blob/e0bbfe4a/services/sts/systests/basic/src/test/resources/org/apache/cxf/systest/sts/rest/cxf-rest-sts.xml ---------------------------------------------------------------------- diff --git a/services/sts/systests/basic/src/test/resources/org/apache/cxf/systest/sts/rest/cxf-rest-sts.xml b/services/sts/systests/basic/src/test/resources/org/apache/cxf/systest/sts/rest/cxf-rest-sts.xml index c9b17ae..9885866 100644 --- a/services/sts/systests/basic/src/test/resources/org/apache/cxf/systest/sts/rest/cxf-rest-sts.xml +++ b/services/sts/systests/basic/src/test/resources/org/apache/cxf/systest/sts/rest/cxf-rest-sts.xml @@ -77,7 +77,14 @@ </bean> <bean id="transportSamlTokenProvider" class="org.apache.cxf.sts.token.provider.SAMLTokenProvider"> </bean> + <util:map id="claimTypes"> + <entry key="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/role" value="roles"/> + </util:map> + <bean id="customJWTClaimsProvider" class="org.apache.cxf.sts.token.provider.jwt.DefaultJWTClaimsProvider"> + <property name="claimTypeMap" ref="claimTypes"/> + </bean> <bean id="transportJWTTokenProvider" class="org.apache.cxf.sts.token.provider.jwt.JWTTokenProvider"> + <property name="jwtClaimsProvider" ref="customJWTClaimsProvider" /> </bean> <bean id="transportJWTTokenValidator" class="org.apache.cxf.sts.token.validator.jwt.JWTTokenValidator"> </bean>
