From f1b3f233dc537d707dd491280648e5b57fb13178 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis Date: Fri, 18 Aug 2023 11:30:56 +0300 Subject: [PATCH] JAVA-13321 Removed code unrelated to spring-cloud-gateway article topics --- .../gateway-2/README-OAuth.md | 40 ------------ .../spring-cloud-bootstrap/gateway-2/pom.xml | 44 ------------- .../oauth/backend/QuotesApplication.java | 44 ------------- .../oauth/backend/domain/Quote.java | 35 ---------- .../oauth/backend/web/QuoteApi.java | 34 ---------- .../ResourceServerGatewayApplication.java | 13 ---- .../KeycloakReactiveTokenInstrospector.java | 65 ------------------- .../resources/application-oauth-client.yml | 26 -------- .../resources/application-resource-server.yml | 19 ------ .../resources/quotes-application.properties | 12 ---- 10 files changed, 332 deletions(-) delete mode 100644 spring-cloud-modules/spring-cloud-bootstrap/gateway-2/README-OAuth.md delete mode 100644 spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/QuotesApplication.java delete mode 100644 spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/domain/Quote.java delete mode 100644 spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/web/QuoteApi.java delete mode 100644 spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/server/ResourceServerGatewayApplication.java delete mode 100644 spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/shared/KeycloakReactiveTokenInstrospector.java delete mode 100644 spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/application-oauth-client.yml delete mode 100644 spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/application-resource-server.yml delete mode 100644 spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/quotes-application.properties diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/README-OAuth.md b/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/README-OAuth.md deleted file mode 100644 index c186114589..0000000000 --- a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/README-OAuth.md +++ /dev/null @@ -1,40 +0,0 @@ -# OAuth Test Setup - -In order to test the OAuth-secured gateway configurations, please follow the steps below - -## Keycloak setup - -1. Clone or download the https://github.com/Baeldung/spring-security-oauth project -2. Replace the file `oauth-rest/oauth-authorization-server/src/main/resources/baeldung-realm.json` - with the one provider here -3. Go to the oauth-rest/oauth-authorization-server folder and use maven to build the project -4. Run the Keycloack service with `mvn spring-boot:run` -5. Once Keycloak is up and running, go to `http://localhost:8083/auth/admin/master/console/#/realms/baeldung` and - log in with using `bael-admin/pass` as credentials -6. Create two test users, so that one belongs to the *Golden Customers* group and the other doesn't. - -## Quotes backend - -Use the provided maven profile: - -``` -$ mvn spring-boot:run -Pquotes-application -``` - -## Gateway as Resource Server - -Use the provided maven profile: - -``` -$ mvn spring-boot:run -Pgateway-as-resource-server -``` - -## Gateway as OAuth 2.0 Client - -Use the provided maven profile: - -``` -$ mvn spring-boot:run -Pgateway-as-oauth-client -``` - - diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/pom.xml b/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/pom.xml index dc42483dc5..520646cc7d 100644 --- a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/pom.xml +++ b/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/pom.xml @@ -121,50 +121,6 @@ - - quotes-application - - - - org.springframework.boot - spring-boot-maven-plugin - - com.baeldung.springcloudgateway.oauth.backend.QuotesApplication - - - - - - - gateway-as-resource-server - - - - org.springframework.boot - spring-boot-maven-plugin - - com.baeldung.springcloudgateway.oauth.server.ResourceServerGatewayApplication - -Dspring.profiles.active=resource-server - - - - - - - gateway-as-oauth-client - - - - org.springframework.boot - spring-boot-maven-plugin - - com.baeldung.springcloudgateway.oauth.server.ResourceServerGatewayApplication - -Dspring.profiles.active=oauth-client - - - - - gateway-url-rewrite diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/QuotesApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/QuotesApplication.java deleted file mode 100644 index 96daf8a73d..0000000000 --- a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/QuotesApplication.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * - */ -package com.baeldung.springcloudgateway.oauth.backend; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.PropertySource; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.security.oauth2.server.resource.introspection.NimbusReactiveOpaqueTokenIntrospector; -import org.springframework.security.oauth2.server.resource.introspection.ReactiveOpaqueTokenIntrospector; - -import com.baeldung.springcloudgateway.oauth.shared.KeycloakReactiveTokenInstrospector; - -/** - * @author Philippe - * - */ -@SpringBootApplication -@PropertySource("classpath:quotes-application.properties") -@EnableWebFluxSecurity -public class QuotesApplication { - - public static void main(String[] args) { - SpringApplication.run(QuotesApplication.class); - } - - - @Bean - public ReactiveOpaqueTokenIntrospector keycloakIntrospector(OAuth2ResourceServerProperties props) { - - NimbusReactiveOpaqueTokenIntrospector delegate = new NimbusReactiveOpaqueTokenIntrospector( - props.getOpaquetoken().getIntrospectionUri(), - props.getOpaquetoken().getClientId(), - props.getOpaquetoken().getClientSecret()); - - return new KeycloakReactiveTokenInstrospector(delegate); - } - - -} - diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/domain/Quote.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/domain/Quote.java deleted file mode 100644 index 042cfa63fa..0000000000 --- a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/domain/Quote.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.baeldung.springcloudgateway.oauth.backend.domain; - - -public class Quote { - - private String symbol; - private double price; - - /** - * @return the symbol - */ - public String getSymbol() { - return symbol; - } - /** - * @param symbol the symbol to set - */ - public void setSymbol(String symbol) { - this.symbol = symbol; - } - /** - * @return the price - */ - public double getPrice() { - return price; - } - /** - * @param price the price to set - */ - public void setPrice(double price) { - this.price = price; - } - - -} diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/web/QuoteApi.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/web/QuoteApi.java deleted file mode 100644 index 6d3721166c..0000000000 --- a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/backend/web/QuoteApi.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.springcloudgateway.oauth.backend.web; - -import javax.annotation.PostConstruct; - -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthentication; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -import com.baeldung.springcloudgateway.oauth.backend.domain.Quote; - -import reactor.core.publisher.Mono; - -@RestController -public class QuoteApi { - private static final GrantedAuthority GOLD_CUSTOMER = new SimpleGrantedAuthority("gold"); - - @GetMapping("/quotes/{symbol}") - public Mono getQuote(@PathVariable("symbol") String symbol, BearerTokenAuthentication auth ) { - - Quote q = new Quote(); - q.setSymbol(symbol); - - if ( auth.getAuthorities().contains(GOLD_CUSTOMER)) { - q.setPrice(10.0); - } - else { - q.setPrice(12.0); - } - return Mono.just(q); - } -} diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/server/ResourceServerGatewayApplication.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/server/ResourceServerGatewayApplication.java deleted file mode 100644 index 1b85867f3b..0000000000 --- a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/server/ResourceServerGatewayApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.springcloudgateway.oauth.server; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; - -@SpringBootApplication -@EnableWebFluxSecurity -public class ResourceServerGatewayApplication { - public static void main(String[] args) { - SpringApplication.run(ResourceServerGatewayApplication.class,args); - } -} diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/shared/KeycloakReactiveTokenInstrospector.java b/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/shared/KeycloakReactiveTokenInstrospector.java deleted file mode 100644 index e834e6934d..0000000000 --- a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/java/com/baeldung/springcloudgateway/oauth/shared/KeycloakReactiveTokenInstrospector.java +++ /dev/null @@ -1,65 +0,0 @@ -/** - * - */ -package com.baeldung.springcloudgateway.oauth.shared; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.oauth2.core.DefaultOAuth2AuthenticatedPrincipal; -import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; -import org.springframework.security.oauth2.server.resource.introspection.ReactiveOpaqueTokenIntrospector; - -import reactor.core.publisher.Mono; - -/** - * Custom ReactiveTokenIntrospector to map realm roles into Spring GrantedAuthorities - * - */ -public class KeycloakReactiveTokenInstrospector implements ReactiveOpaqueTokenIntrospector { - - private final ReactiveOpaqueTokenIntrospector delegate; - - public KeycloakReactiveTokenInstrospector(ReactiveOpaqueTokenIntrospector delegate) { - this.delegate = delegate; - } - - @Override - public Mono introspect(String token) { - - return delegate.introspect(token) - .map( this::mapPrincipal); - } - - protected OAuth2AuthenticatedPrincipal mapPrincipal(OAuth2AuthenticatedPrincipal principal) { - - return new DefaultOAuth2AuthenticatedPrincipal( - principal.getName(), - principal.getAttributes(), - extractAuthorities(principal)); - } - - protected Collection extractAuthorities(OAuth2AuthenticatedPrincipal principal) { - - // - Map> realm_access = principal.getAttribute("realm_access"); - List roles = realm_access.getOrDefault("roles", Collections.emptyList()); - List rolesAuthorities = roles.stream() - .map(SimpleGrantedAuthority::new) - .collect(Collectors.toList()); - - Set allAuthorities = new HashSet<>(); - allAuthorities.addAll(principal.getAuthorities()); - allAuthorities.addAll(rolesAuthorities); - - return allAuthorities; - } - -} diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/application-oauth-client.yml b/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/application-oauth-client.yml deleted file mode 100644 index b097c54eb1..0000000000 --- a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/application-oauth-client.yml +++ /dev/null @@ -1,26 +0,0 @@ -server: - port: 8087 -spring: - cloud: - gateway: - redis: - enabled: false - routes: - - id: quotes - uri: http://localhost:8085 - predicates: - - Path=/quotes/** - filters: - TokenRelay= - security: - oauth2: - client: provider: keycloak: - issuer-uri: http://localhost:8083/auth/realms/baeldung - registration: quotes-client: - provider: keycloak - client-id: quotes-client - client-secret: 0e082231-a70d-48e8-b8a5-fbfb743041b6 - scope: - email - - profile - - roles - - \ No newline at end of file diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/application-resource-server.yml b/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/application-resource-server.yml deleted file mode 100644 index 14f713a04a..0000000000 --- a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/application-resource-server.yml +++ /dev/null @@ -1,19 +0,0 @@ -server: - port: 8086 -spring: - security: - oauth2: - resourceserver: - opaquetoken: - introspection-uri: http://localhost:8083/auth/realms/baeldung/protocol/openid-connect/token/introspect - client-id: quotes-client - client-secret: 0e082231-a70d-48e8-b8a5-fbfb743041b6 - cloud: - gateway: - redis: - enabled: false - routes: - - id: quotes - uri: http://localhost:8085 - predicates: - - Path=/quotes/** diff --git a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/quotes-application.properties b/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/quotes-application.properties deleted file mode 100644 index 48e8999b1b..0000000000 --- a/spring-cloud-modules/spring-cloud-bootstrap/gateway-2/src/main/resources/quotes-application.properties +++ /dev/null @@ -1,12 +0,0 @@ -server.port=8085 -# Disable gateway & redis as we don't need them in this application -spring.cloud.gateway.enabled=false -spring.cloud.gateway.redis.enabled=false - -# Resource server settings -spring.security.oauth2.resourceserver.opaquetoken.introspection-uri=http://localhost:8083/auth/realms/baeldung/protocol/openid-connect/token/introspect -spring.security.oauth2.resourceserver.opaquetoken.client-id=quotes-client -spring.security.oauth2.resourceserver.opaquetoken.client-secret=0e082231-a70d-48e8-b8a5-fbfb743041b6 - - -