diff --git a/adapters/oidc/spring-boot/pom.xml b/adapters/oidc/spring-boot/pom.xml index 3ff64a7e6f..901a5fa4c5 100755 --- a/adapters/oidc/spring-boot/pom.xml +++ b/adapters/oidc/spring-boot/pom.xml @@ -31,7 +31,7 @@ - 1.3.0.RELEASE + 1.4.0.RELEASE 4.1.6.RELEASE 1.9.5 diff --git a/adapters/oidc/spring-boot/src/main/java/org/keycloak/adapters/springboot/client/KeycloakRestTemplateCustomizer.java b/adapters/oidc/spring-boot/src/main/java/org/keycloak/adapters/springboot/client/KeycloakRestTemplateCustomizer.java new file mode 100644 index 0000000000..ae4836c713 --- /dev/null +++ b/adapters/oidc/spring-boot/src/main/java/org/keycloak/adapters/springboot/client/KeycloakRestTemplateCustomizer.java @@ -0,0 +1,24 @@ +package org.keycloak.adapters.springboot.client; + +import org.springframework.boot.web.client.RestTemplateCustomizer; +import org.springframework.web.client.RestTemplate; + +public class KeycloakRestTemplateCustomizer implements RestTemplateCustomizer { + + private final KeycloakSecurityContextClientRequestInterceptor keycloakInterceptor; + + public KeycloakRestTemplateCustomizer() { + this(new KeycloakSecurityContextClientRequestInterceptor()); + } + + protected KeycloakRestTemplateCustomizer( + KeycloakSecurityContextClientRequestInterceptor keycloakInterceptor + ) { + this.keycloakInterceptor = keycloakInterceptor; + } + + @Override + public void customize(RestTemplate restTemplate) { + restTemplate.getInterceptors().add(keycloakInterceptor); + } +} diff --git a/adapters/oidc/spring-boot/src/main/java/org/keycloak/adapters/springboot/client/EmbeddedServletClientRequestFactory.java b/adapters/oidc/spring-boot/src/main/java/org/keycloak/adapters/springboot/client/KeycloakSecurityContextClientRequestInterceptor.java similarity index 63% rename from adapters/oidc/spring-boot/src/main/java/org/keycloak/adapters/springboot/client/EmbeddedServletClientRequestFactory.java rename to adapters/oidc/spring-boot/src/main/java/org/keycloak/adapters/springboot/client/KeycloakSecurityContextClientRequestInterceptor.java index 046d71c8c1..200a9035f1 100644 --- a/adapters/oidc/spring-boot/src/main/java/org/keycloak/adapters/springboot/client/EmbeddedServletClientRequestFactory.java +++ b/adapters/oidc/spring-boot/src/main/java/org/keycloak/adapters/springboot/client/KeycloakSecurityContextClientRequestInterceptor.java @@ -2,25 +2,26 @@ package org.keycloak.adapters.springboot.client; import org.keycloak.KeycloakPrincipal; import org.keycloak.KeycloakSecurityContext; -import org.keycloak.adapters.springsecurity.client.KeycloakClientRequestFactory; -import org.springframework.http.client.ClientHttpRequest; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import java.io.IOException; import java.security.Principal; /** - * Factory for {@link ClientHttpRequest} objects created for server to server secured + * Interceptor for {@link ClientHttpRequestExecution} objects created for server to server secured * communication using OAuth2 bearer tokens issued by Keycloak. * * @author James McShane * @version $Revision: 1 $ */ -public class EmbeddedServletClientRequestFactory extends KeycloakClientRequestFactory { +public class KeycloakSecurityContextClientRequestInterceptor implements ClientHttpRequestInterceptor { - public EmbeddedServletClientRequestFactory() { - super(); - } + private static final String AUTHORIZATION_HEADER = "Authorization"; /** * Returns the {@link KeycloakSecurityContext} from the Spring {@link ServletRequestAttributes}'s {@link Principal}. @@ -44,4 +45,11 @@ public class EmbeddedServletClientRequestFactory extends KeycloakClientRequestFa } return ((KeycloakPrincipal) principal).getKeycloakSecurityContext(); } + + @Override + public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] bytes, ClientHttpRequestExecution clientHttpRequestExecution) throws IOException { + KeycloakSecurityContext context = this.getKeycloakSecurityContext(); + httpRequest.getHeaders().set(AUTHORIZATION_HEADER, "Bearer " + context.getTokenString()); + return clientHttpRequestExecution.execute(httpRequest, bytes); + } } diff --git a/adapters/oidc/spring-boot/src/test/java/org/keycloak/adapters/springboot/client/KeycloakRestTemplateCustomizerTest.java b/adapters/oidc/spring-boot/src/test/java/org/keycloak/adapters/springboot/client/KeycloakRestTemplateCustomizerTest.java new file mode 100644 index 0000000000..e8e599e40d --- /dev/null +++ b/adapters/oidc/spring-boot/src/test/java/org/keycloak/adapters/springboot/client/KeycloakRestTemplateCustomizerTest.java @@ -0,0 +1,28 @@ +package org.keycloak.adapters.springboot.client; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.web.client.RestTemplate; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +public class KeycloakRestTemplateCustomizerTest { + + private KeycloakRestTemplateCustomizer customizer; + private KeycloakSecurityContextClientRequestInterceptor interceptor = + mock(KeycloakSecurityContextClientRequestInterceptor.class); + + @Before + public void setup() { + customizer = new KeycloakRestTemplateCustomizer(interceptor); + } + + @Test + public void interceptorIsAddedToRequest() { + RestTemplate restTemplate = new RestTemplate(); + customizer.customize(restTemplate); + assertTrue(restTemplate.getInterceptors().contains(interceptor)); + } + +} diff --git a/adapters/oidc/spring-boot/src/test/java/org/keycloak/adapters/springboot/client/EmbeddedServletClientRequestFactoryTest.java b/adapters/oidc/spring-boot/src/test/java/org/keycloak/adapters/springboot/client/KeycloakSecurityContextClientRequestInterceptorTest.java similarity index 95% rename from adapters/oidc/spring-boot/src/test/java/org/keycloak/adapters/springboot/client/EmbeddedServletClientRequestFactoryTest.java rename to adapters/oidc/spring-boot/src/test/java/org/keycloak/adapters/springboot/client/KeycloakSecurityContextClientRequestInterceptorTest.java index 1e1bd174f7..689cc65274 100644 --- a/adapters/oidc/spring-boot/src/test/java/org/keycloak/adapters/springboot/client/EmbeddedServletClientRequestFactoryTest.java +++ b/adapters/oidc/spring-boot/src/test/java/org/keycloak/adapters/springboot/client/KeycloakSecurityContextClientRequestInterceptorTest.java @@ -37,10 +37,10 @@ import static org.mockito.Mockito.when; /** * Keycloak spring boot client request factory tests. */ -public class EmbeddedServletClientRequestFactoryTest { +public class KeycloakSecurityContextClientRequestInterceptorTest { @Spy - private EmbeddedServletClientRequestFactory factory; + private KeycloakSecurityContextClientRequestInterceptor factory; private MockHttpServletRequest servletRequest;