From 94e381306f17d4970ce5cb3a90fb09e17ef664e7 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Tue, 1 Sep 2020 10:18:19 -0600 Subject: [PATCH 1/2] Fix CORS Configuration for Spring Cloud Gateway --- .../java/com/example/apigateway/ApiGatewayApplication.java | 5 ++++- .../java/com/example/apigateway/SecurityConfiguration.java | 7 +++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/spring-cloud-gateway/api-gateway/src/main/java/com/example/apigateway/ApiGatewayApplication.java b/spring-cloud-gateway/api-gateway/src/main/java/com/example/apigateway/ApiGatewayApplication.java index 5ee2d2d..1060f86 100755 --- a/spring-cloud-gateway/api-gateway/src/main/java/com/example/apigateway/ApiGatewayApplication.java +++ b/spring-cloud-gateway/api-gateway/src/main/java/com/example/apigateway/ApiGatewayApplication.java @@ -9,6 +9,8 @@ import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.security.oauth2.gateway.TokenRelayGatewayFilterFactory; import org.springframework.context.annotation.Bean; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; +import org.springframework.security.oauth2.client.annotation.RegisteredOAuth2AuthorizedClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.reactive.function.client.WebClient; @@ -59,8 +61,9 @@ public FaveCarsController(WebClient.Builder carClient) { } @GetMapping("/fave-cars") - public Flux faveCars() { + public Flux faveCars(@RegisteredOAuth2AuthorizedClient("okta") OAuth2AuthorizedClient authorizedClient) { return carClient.build().get().uri("lb://car-service/cars") + .header("Authorization", "Bearer " + authorizedClient.getAccessToken().getTokenValue()) .retrieve().bodyToFlux(Car.class) .filter(this::isFavorite); } diff --git a/spring-cloud-gateway/api-gateway/src/main/java/com/example/apigateway/SecurityConfiguration.java b/spring-cloud-gateway/api-gateway/src/main/java/com/example/apigateway/SecurityConfiguration.java index 56c37b6..adb18c1 100644 --- a/spring-cloud-gateway/api-gateway/src/main/java/com/example/apigateway/SecurityConfiguration.java +++ b/spring-cloud-gateway/api-gateway/src/main/java/com/example/apigateway/SecurityConfiguration.java @@ -6,7 +6,7 @@ import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.web.server.SecurityWebFilterChain; import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.reactive.CorsWebFilter; +import org.springframework.web.cors.reactive.CorsConfigurationSource; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import java.util.List; @@ -31,7 +31,7 @@ public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { } @Bean - CorsWebFilter corsWebFilter() { + CorsConfigurationSource corsConfigurationSource() { CorsConfiguration corsConfig = new CorsConfiguration(); corsConfig.setAllowedOrigins(List.of("*")); corsConfig.setMaxAge(3600L); @@ -40,7 +40,6 @@ CorsWebFilter corsWebFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", corsConfig); - - return new CorsWebFilter(source); + return source; } } From f8c4256b757fa4a9a6b479d77d84f7e825fd0dc7 Mon Sep 17 00:00:00 2001 From: ImgBotApp Date: Fri, 4 Dec 2020 20:43:35 +0000 Subject: [PATCH 2/2] [ImgBot] Optimize images *Total -- 551.46kb -> 438.10kb (20.56%) /jhipster/gateway/src/main/webapp/swagger-ui/dist/images/throbber.gif -- 9.04kb -> 5.97kb (33.94%) /jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2.svg -- 52.99kb -> 40.05kb (24.42%) /jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1.svg -- 447.37kb -> 351.57kb (21.42%) /jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3.svg -- 25.52kb -> 24.48kb (4.06%) /jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0.svg -- 16.54kb -> 16.03kb (3.05%) Signed-off-by: ImgBotApp --- .../images/jhipster_family_member_0.svg | 199 +- .../images/jhipster_family_member_1.svg | 9388 +---------------- .../images/jhipster_family_member_2.svg | 842 +- .../images/jhipster_family_member_3.svg | 309 +- .../swagger-ui/dist/images/throbber.gif | Bin 9257 -> 6115 bytes 5 files changed, 4 insertions(+), 10734 deletions(-) diff --git a/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0.svg b/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0.svg index 1f9ab52..fd59561 100755 --- a/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0.svg +++ b/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_0.svg @@ -1,198 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1.svg b/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1.svg index 7a118f3..508aa1e 100755 --- a/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1.svg +++ b/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_1.svg @@ -1,9387 +1 @@ - - - -image/svg+xml \ No newline at end of file + \ No newline at end of file diff --git a/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2.svg b/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2.svg index 1747933..69f3f43 100755 --- a/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2.svg +++ b/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_2.svg @@ -1,841 +1 @@ - - - -image/svg+xml \ No newline at end of file + \ No newline at end of file diff --git a/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3.svg b/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3.svg index 6b9e056..fbbe8f7 100755 --- a/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3.svg +++ b/jhipster/gateway/src/main/webapp/content/images/jhipster_family_member_3.svg @@ -1,308 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/jhipster/gateway/src/main/webapp/swagger-ui/dist/images/throbber.gif b/jhipster/gateway/src/main/webapp/swagger-ui/dist/images/throbber.gif index 06393889242fb3ea9e0205fa84369ec7bb66d15a..0a55cf035e3d5b44edf525903310bdc977634679 100644 GIT binary patch literal 6115 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 literal 9257 zcmd^^X;@R|x`tQg5wbE8AV3mAn1TjmQ&en2CK8~ENEH<+P_)pZ24y2E+7O0>K^a6u zQ3;5MiU^7p6*M3qDk!2=YEcHMQ>nzEYP;R`e2C@r+U+?#XaC*&gKPcB#k$`o&;7mu zYNhYYXe|Uo84#4ZIko#rcU5K8*yFL{qT47O&^5fZH$ zVZ@%(l~vVHjnm;H@KL8@r%yUHoo;rbHI_4lIH(_nsTT>S2`DFOD~uCb9_dF4`#QgI zy7ldMcLs+A_s%|e1pRPrbX-tpeNP!9(IpMFTce`t_5U%lP99z%&i6`1d~ zWeM!Rxc50<+d$e^9LT`?B+aMK~apR zHm?q;p<7{wN2g|I^aGlSws;VP84j(z%aQwvAWv83Z$}p(% zZ^?2;gxg(ey_`V5J7{;!o;o;KslW@z5EP~JGs|U)J7dF&(ff#A=6vU?cGQ$-4+;Jf z-ggJEa!yStn`_EWvl)#yhm6XVs}UUbsi;+agri;mCfjH^Uy;lH+Zw^h)4N?oZgZz4 zJk(fTZ|Bi^;+s_M=~+d#vyoxEPzTlOS=mX@sbl*uRj>=MaMr}cFIY8i?UM61>86uB zV$DlOUCiUJwbzJMP@D$urzK|lL2-PC!p1l47V-ZG<5Ev0Z5h~Kx?`KOp7gkAjV93A z-Gc7MrlxTf?wF;CbNc@tCHJH{TB3c;#{SVu%97}tyAM2n&|9W_?qv}$*Jt*%7Yxb# zV0;d;7|lDEltJYS+U)#aiJO};?_Jyy_4%syQ(uy?-J-Yx-9O5nKRk@@XSS~X<(2u~ zV-LamWm~!iqtH9wkpf8mAXZhOD&L#aA_%)4h2M;1M5jt zIR>Us+%W-GXa_f^opKg=DSrAs)AXeRa;Hp0aC1OgbxQ%Qr_QvTleM1jkR!2mkcX$3 ztsR8~G9iqh(-FJ@F_rQBIYDXV_6s7G9SxaVF^laZqcx$!D97m|7t16j6@Jt6UdDRy49Qyvs|c>RuA|@b%}`*wU}2^7q;&Vtc6@lb zcXl)T!6nYDzmMJ~%n$KNXyNlCG)GkJ4!82;v6@d3>s5r~E+3!O?049JDr14Y^PeMI02R`0lJ^=oJ zYd|*u9|SU(j7hY?+<=(?fP*mtV*zFhOrz6%{VA?ozdm&(Jf^V zMfPZ?>l`mS3{Uq8IM;e!+1YjJy2!mzK$O|wPeU{*QSbs9m+@`f5KxO3PBnQ=%RsZg%go*fJ`*w9TL{-WgZVIA$!YV}3BRcfeXaR$x#b zW)Tpd#8E4)^MyYdkH;4_;ChJuw%n+Be7Ko4;w-nHvyo$d_0e-YiF78Df&)_)(}fcr_r0mPH(4RRYWIu+d@t0&Ss@O^s! zOKyX&13)%N@83r^;QsgN{rl(!0|RF1FA)b1{CRXAy&1ySz@>olPiR4r$aMdq&_=nK zq|cFs8phWJ1@%dZ-gXd{zDbTILD>)qEvH-NU*Rf1b2J1Ri79`rBFl@ z8E^0I)OqEi{pH(a24b9YPG;Kz@t-qZW;3Mpe`MRlmYx{7bH-XZ&`RQ7Rb^%}gc&X| zd}Q-FZf|RWxHU?PR!(C?80zu(^l>*h{#ulSiid(O!J(8P-41bNM3tnX@U6NS5yo0? zdcF)~xFE&+&|gZ$23dV5t~?$$&ymZ;F8j7GGMncGSsDo%>J`26=&l=X#rSKv_64;0 zr;k6no@=gV`P)K!=kaHl>q?!`X>(A;84tg^Md<`zA%qbRLby1Z=fn*ZRdNqs%Tq|3 zOt}lZu0q9oKJhgz&+^7PCt$=UFW=R*w?a1)ePoL*`R$Gxj?TU@12tTHsT$giHQU+sqf;fS0FpT!< z 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