Skip to content

Commit e77f9ea

Browse files
authored
Add new OAuth2RequestInterceptor to remove deprecated open feign classes (#16011)
* Add new OAuth2RequestInterceptor to remove deprecated open feign classes * Add override * Add version * Add older version * Update docs * Fix issue with multiple security schemes * Move cli option to spring code gen * Fix documentation options * Remove resource folder * Fix duplicate annotation * Add an enable flag * Remove generator setting * Revert codgen changes * Revert config generator changes
1 parent c6f6ef9 commit e77f9ea

File tree

43 files changed

+618
-264
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+618
-264
lines changed

docs/generators/java-camel.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
7777
|prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false|
7878
|reactive|wrap responses in Mono/Flux Reactor types (spring-boot only)| |false|
7979
|requestMappingMode|Where to generate the class level @RequestMapping annotation.|<dl><dt>**api_interface**</dt><dd>Generate the @RequestMapping annotation on the generated Api Interface.</dd><dt>**controller**</dt><dd>Generate the @RequestMapping annotation on the generated Api Controller Implementation.</dd><dt>**none**</dt><dd>Do not add a class level @RequestMapping annotation.</dd></dl>|controller|
80+
|resourceFolder|resource folder for generated resources| |src/main/resources|
8081
|responseWrapper|wrap the responses in given type (Future, Callable, CompletableFuture,ListenableFuture, DeferredResult, RxObservable, RxSingle or fully qualified type)| |null|
8182
|returnSuccessCode|Generated server returns 2xx code| |false|
8283
|scmConnection|SCM connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git|

docs/generators/spring.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
7070
|prependFormOrBodyParameters|Add form or body parameters to the beginning of the parameter list.| |false|
7171
|reactive|wrap responses in Mono/Flux Reactor types (spring-boot only)| |false|
7272
|requestMappingMode|Where to generate the class level @RequestMapping annotation.|<dl><dt>**api_interface**</dt><dd>Generate the @RequestMapping annotation on the generated Api Interface.</dd><dt>**controller**</dt><dd>Generate the @RequestMapping annotation on the generated Api Controller Implementation.</dd><dt>**none**</dt><dd>Do not add a class level @RequestMapping annotation.</dd></dl>|controller|
73+
|resourceFolder|resource folder for generated resources| |src/main/resources|
7374
|responseWrapper|wrap the responses in given type (Future, Callable, CompletableFuture,ListenableFuture, DeferredResult, RxObservable, RxSingle or fully qualified type)| |null|
7475
|returnSuccessCode|Generated server returns 2xx code| |false|
7576
|scmConnection|SCM connection in generated pom.xml| |scm:git:git@github.com:openapitools/openapi-generator.git|

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public class SpringCodegen extends AbstractJavaCodegen
7777
implements BeanValidationFeatures, PerformBeanValidationFeatures, OptionalFeatures, SwaggerUIFeatures {
7878
private final Logger LOGGER = LoggerFactory.getLogger(SpringCodegen.class);
7979

80+
8081
public static final String TITLE = "title";
8182
public static final String SERVER_PORT = "serverPort";
8283
public static final String CONFIG_PACKAGE = "configPackage";
@@ -90,6 +91,9 @@ public class SpringCodegen extends AbstractJavaCodegen
9091
public static final String SKIP_DEFAULT_INTERFACE = "skipDefaultInterface";
9192
public static final String GENERATE_CONSTRUCTOR_WITH_REQUIRED_ARGS = "generatedConstructorWithRequiredArgs";
9293

94+
public static final String RESOURCE_FOLDER = "resourceFolder";
95+
public static final String RESOURCE_FOLDER_DESC = "resource folder for generated resources";
96+
9397
public static final String ASYNC = "async";
9498
public static final String REACTIVE = "reactive";
9599
public static final String RESPONSE_WRAPPER = "responseWrapper";
@@ -131,6 +135,8 @@ public String getDescription() {
131135
protected String title = "OpenAPI Spring";
132136
protected String configPackage = "org.openapitools.configuration";
133137
protected String basePackage = "org.openapitools";
138+
protected String resourceFolder = projectFolder + "/resources";
139+
134140
protected boolean interfaceOnly = false;
135141
protected boolean useFeignClientUrl = true;
136142
protected boolean delegatePattern = false;
@@ -256,6 +262,7 @@ public SpringCodegen() {
256262
cliOptions.add(CliOption.newBoolean(GENERATE_CONSTRUCTOR_WITH_REQUIRED_ARGS,
257263
"Whether to generate constructors with required args for models",
258264
generatedConstructorWithRequiredArgs));
265+
cliOptions.add(new CliOption(RESOURCE_FOLDER, RESOURCE_FOLDER_DESC).defaultValue(this.getResourceFolder()));
259266

260267
supportedLibraries.put(SPRING_BOOT, "Spring-boot Server application.");
261268
supportedLibraries.put(SPRING_CLOUD_LIBRARY,
@@ -531,6 +538,11 @@ public void processOpts() {
531538
}
532539
writePropertyBack(USE_SPRING_BOOT3, isUseSpringBoot3());
533540

541+
if (additionalProperties.containsKey(RESOURCE_FOLDER)) {
542+
this.setResourceFolder((String) additionalProperties.get(RESOURCE_FOLDER));
543+
}
544+
additionalProperties.put(RESOURCE_FOLDER, resourceFolder);
545+
534546

535547
typeMapping.put("file", "org.springframework.core.io.Resource");
536548
importMapping.put("org.springframework.core.io.Resource", "org.springframework.core.io.Resource");
@@ -575,9 +587,18 @@ public void processOpts() {
575587
"RFC3339DateFormat.java"));
576588
}
577589
if (SPRING_CLOUD_LIBRARY.equals(library)) {
590+
578591
supportingFiles.add(new SupportingFile("apiKeyRequestInterceptor.mustache",
579-
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator),
580-
"ApiKeyRequestInterceptor.java"));
592+
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator),
593+
"ApiKeyRequestInterceptor.java"));
594+
595+
supportingFiles.add(new SupportingFile("oauth2ClientProperties.mustache",
596+
resourceFolder, "oauth2-client.properties"));
597+
598+
supportingFiles.add(new SupportingFile("clientPropertiesConfiguration.mustache",
599+
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator),
600+
"ClientPropertiesConfiguration.java"));
601+
581602
supportingFiles.add(new SupportingFile("clientConfiguration.mustache",
582603
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator),
583604
"ClientConfiguration.java"));
@@ -1349,6 +1370,14 @@ private String replaceBeanValidationCollectionType(CodegenProperty codegenProper
13491370
return dataType.replace( "<", "<@Valid " );
13501371
}
13511372

1373+
public void setResourceFolder( String resourceFolder ) {
1374+
this.resourceFolder = resourceFolder;
1375+
}
1376+
1377+
public String getResourceFolder() {
1378+
return resourceFolder;
1379+
}
1380+
13521381

13531382
// This should prevent, that the response data types not contains a @Valid annotation.
13541383
// However, the side effect is that attributes with response as name are also affected.

modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-cloud/clientConfiguration.mustache

Lines changed: 65 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,39 @@ package {{configPackage}};
33
{{#authMethods}}
44
{{#isBasicBasic}}
55
import feign.auth.BasicAuthRequestInterceptor;
6-
{{/isBasicBasic}}
7-
{{#-first}}
6+
{{^hasApiKeyMethods}}
87
import org.springframework.beans.factory.annotation.Value;
9-
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
10-
{{/-first}}
11-
{{#isOAuth}}
12-
import org.springframework.boot.context.properties.ConfigurationProperties;
13-
{{/isOAuth}}
8+
{{/hasApiKeyMethods}}
9+
{{/isBasicBasic}}
1410
{{/authMethods}}
15-
import org.springframework.boot.context.properties.EnableConfigurationProperties;
16-
{{#authMethods}}
17-
{{#-first}}
11+
{{#hasAuthMethods}}
1812
import org.springframework.context.annotation.Bean;
19-
{{/-first}}
20-
{{/authMethods}}
13+
{{#hasApiKeyMethods}}
14+
import org.springframework.beans.factory.annotation.Value;
15+
{{/hasApiKeyMethods}}
16+
{{#hasOAuthMethods}}
17+
import org.springframework.security.authentication.AnonymousAuthenticationToken;
18+
import org.springframework.security.oauth2.client.AuthorizedClientServiceOAuth2AuthorizedClientManager;
19+
import org.springframework.security.oauth2.client.OAuth2AuthorizeRequest;
20+
import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
21+
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
22+
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService;
23+
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
24+
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
25+
import org.springframework.security.oauth2.core.OAuth2AccessToken;
26+
import org.springframework.security.core.authority.AuthorityUtils;
27+
import org.springframework.http.HttpHeaders;
28+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
29+
30+
import feign.RequestInterceptor;
31+
import feign.RequestTemplate;
32+
33+
{{/hasOAuthMethods}}
34+
{{/hasAuthMethods}}
2135
import org.springframework.context.annotation.Configuration;
22-
{{#authMethods}}
23-
{{#isOAuth}}
24-
{{#useSpringBoot3}}
25-
import org.springframework.cloud.security.oauth2.client.feign.OAuth2FeignRequestInterceptor;
26-
{{/useSpringBoot3}}
27-
{{^useSpringBoot3}}
28-
import org.springframework.cloud.openfeign.security.OAuth2FeignRequestInterceptor;
29-
{{/useSpringBoot3}}
30-
import org.springframework.security.oauth2.client.DefaultOAuth2ClientContext;
31-
import org.springframework.security.oauth2.client.OAuth2ClientContext;
32-
{{#isApplication}}
33-
import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails;
34-
{{/isApplication}}
35-
{{#isCode}}
36-
import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails;
37-
{{/isCode}}
38-
{{#isImplicit}}
39-
import org.springframework.security.oauth2.client.token.grant.implicit.ImplicitResourceDetails;
40-
{{/isImplicit}}
41-
{{#isPassword}}
42-
import org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordResourceDetails;
43-
{{/isPassword}}
44-
{{/isOAuth}}
45-
{{/authMethods}}
36+
4637

4738
@Configuration
48-
@EnableConfigurationProperties
4939
public class ClientConfiguration {
5040
5141
{{#authMethods}}
@@ -75,63 +65,53 @@ public class ClientConfiguration {
7565

7666
{{/isApiKey}}
7767
{{#isOAuth}}
78-
@Bean
79-
@ConditionalOnProperty("{{#lambda.lowercase}}{{{title}}}{{/lambda.lowercase}}.security.{{{name}}}.client-id")
80-
public OAuth2FeignRequestInterceptor {{{name}}}RequestInterceptor(OAuth2ClientContext oAuth2ClientContext) {
81-
return new OAuth2FeignRequestInterceptor(oAuth2ClientContext, {{{name}}}ResourceDetails());
82-
}
68+
private static final String CLIENT_PRINCIPAL_{{#lambda.uppercase}}{{{flow}}}{{/lambda.uppercase}} = "oauth2FeignClient";
8369

8470
@Bean
85-
@ConditionalOnProperty("{{#lambda.lowercase}}{{{title}}}{{/lambda.lowercase}}.security.{{{name}}}.client-id")
86-
public OAuth2ClientContext oAuth2ClientContext() {
87-
return new DefaultOAuth2ClientContext();
71+
@ConditionalOnProperty( prefix = "spring.security.oauth2.client.registration.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}", name = "enabled", havingValue = "true" )
72+
public OAuth2RequestInterceptor {{{flow}}}OAuth2RequestInterceptor(final OAuth2AuthorizedClientManager {{{flow}}}AuthorizedClientManager ) {
73+
return new OAuth2RequestInterceptor(OAuth2AuthorizeRequest.withClientRegistrationId("{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}")
74+
.principal( new AnonymousAuthenticationToken( CLIENT_PRINCIPAL_{{#lambda.uppercase}}{{{flow}}}{{/lambda.uppercase}}, CLIENT_PRINCIPAL_{{#lambda.uppercase}}{{{flow}}}{{/lambda.uppercase}}, AuthorityUtils.createAuthorityList( "ROLE_ANONYMOUS" ) ) )
75+
.build(), {{{flow}}}AuthorizedClientManager );
8876
}
8977

90-
{{#isCode}}
9178
@Bean
92-
@ConditionalOnProperty("{{#lambda.lowercase}}{{{title}}}{{/lambda.lowercase}}.security.{{{name}}}.client-id")
93-
@ConfigurationProperties("{{#lambda.lowercase}}{{{title}}}{{/lambda.lowercase}}.security.{{{name}}}")
94-
public AuthorizationCodeResourceDetails {{{name}}}ResourceDetails() {
95-
AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
96-
details.setAccessTokenUri("{{{tokenUrl}}}");
97-
details.setUserAuthorizationUri("{{{authorizationUrl}}}");
98-
return details;
79+
@ConditionalOnProperty( prefix = "spring.security.oauth2.client.registration.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}", name = "enabled", havingValue = "true" )
80+
public OAuth2AuthorizedClientManager {{{flow}}}AuthorizedClientManager(ClientRegistrationRepository clientRegistrationRepository,
81+
OAuth2AuthorizedClientService authorizedClientService ) {
82+
return new AuthorizedClientServiceOAuth2AuthorizedClientManager( clientRegistrationRepository, authorizedClientService );
9983
}
84+
{{/isOAuth}}
85+
{{/authMethods}}
86+
{{#hasOAuthMethods}}
87+
public static class OAuth2RequestInterceptor implements RequestInterceptor {
10088
101-
{{/isCode}}
102-
{{#isPassword}}
103-
@Bean
104-
@ConditionalOnProperty("{{#lambda.lowercase}}{{{title}}}{{/lambda.lowercase}}.security.{{{name}}}.client-id")
105-
@ConfigurationProperties("{{#lambda.lowercase}}{{{title}}}{{/lambda.lowercase}}.security.{{{name}}}")
106-
public ResourceOwnerPasswordResourceDetails {{{name}}}ResourceDetails() {
107-
ResourceOwnerPasswordResourceDetails details = new ResourceOwnerPasswordResourceDetails();
108-
details.setAccessTokenUri("{{{tokenUrl}}}");
109-
return details;
110-
}
89+
private final OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager;
90+
private final OAuth2AuthorizeRequest oAuth2AuthorizeRequest;
11191
112-
{{/isPassword}}
113-
{{#isApplication}}
114-
@Bean
115-
@ConditionalOnProperty("{{#lambda.lowercase}}{{{title}}}{{/lambda.lowercase}}.security.{{{name}}}.client-id")
116-
@ConfigurationProperties("{{#lambda.lowercase}}{{{title}}}{{/lambda.lowercase}}.security.{{{name}}}")
117-
public ClientCredentialsResourceDetails {{{name}}}ResourceDetails() {
118-
ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails();
119-
details.setAccessTokenUri("{{{tokenUrl}}}");
120-
return details;
121-
}
92+
public OAuth2RequestInterceptor(OAuth2AuthorizeRequest oAuth2AuthorizeRequest,OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager){
93+
this.oAuth2AuthorizeRequest = oAuth2AuthorizeRequest;
94+
this.oAuth2AuthorizedClientManager = oAuth2AuthorizedClientManager;
95+
}
12296

123-
{{/isApplication}}
124-
{{#isImplicit}}
125-
@Bean
126-
@ConditionalOnProperty("{{#lambda.lowercase}}{{{title}}}{{/lambda.lowercase}}.security.{{{name}}}.client-id")
127-
@ConfigurationProperties("{{#lambda.lowercase}}{{{title}}}{{/lambda.lowercase}}.security.{{{name}}}")
128-
public ImplicitResourceDetails {{{name}}}ResourceDetails() {
129-
ImplicitResourceDetails details = new ImplicitResourceDetails();
130-
details.setUserAuthorizationUri("{{{authorizationUrl}}}");
131-
return details;
97+
@Override
98+
public void apply( final RequestTemplate template ) {
99+
template.header( HttpHeaders.AUTHORIZATION, getBearerToken() );
100+
}
101+
102+
public OAuth2AccessToken getAccessToken() {
103+
final OAuth2AuthorizedClient authorizedClient = oAuth2AuthorizedClientManager.authorize(oAuth2AuthorizeRequest);
104+
if (authorizedClient == null) {
105+
throw new OAuth2AuthenticationException( "Client failed to authenticate");
106+
}
107+
return authorizedClient.getAccessToken();
108+
}
109+
110+
public String getBearerToken() {
111+
final OAuth2AccessToken accessToken = getAccessToken();
112+
return String.format( "%s %s", accessToken.getTokenType().getValue(), accessToken.getTokenValue() );
113+
}
132114
}
115+
{{/hasOAuthMethods}}
133116

134-
{{/isImplicit}}
135-
{{/isOAuth}}
136-
{{/authMethods}}
137117
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package {{configPackage}};
2+
3+
{{#authMethods}}
4+
{{#isOAuth}}
5+
import org.springframework.context.annotation.PropertySource;
6+
{{/isOAuth}}
7+
{{/authMethods}}
8+
import org.springframework.context.annotation.Configuration;
9+
10+
{{#hasAuthMethods}}
11+
{{#hasOAuthMethods}}
12+
@PropertySource( "classpath:/oauth2-client.properties" )
13+
{{/hasOAuthMethods}}
14+
{{/hasAuthMethods}}
15+
@Configuration
16+
public class ClientPropertiesConfiguration {
17+
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{{#authMethods}}
2+
{{#isOAuth}}
3+
spring.security.oauth2.client.registration.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.enabled=false
4+
spring.security.oauth2.client.registration.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.client-id=set-{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}-client-id
5+
{{#scopes}}{{#-first}}spring.security.oauth2.client.registration.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.scopes={{/-first}}{{scope}}{{^-last}},{{/-last}}{{/scopes}}
6+
{{#isCode}}
7+
spring.security.oauth2.client.registration.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.authorization-grant-type=authorization_code
8+
spring.security.oauth2.client.registration.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.redirect-uri=set-{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}-redirect-uri
9+
spring.security.oauth2.client.provider.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.token-uri={{{tokenUrl}}}
10+
spring.security.oauth2.client.provider.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.authorization-uri={{{authorizationUrl}}}
11+
{{/isCode}}
12+
{{#isPassword}}
13+
spring.security.oauth2.client.registration.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.authorization-grant-type=password
14+
spring.security.oauth2.client.provider.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.token-uri={{{tokenUrl}}}
15+
{{/isPassword}}
16+
{{#isApplication}}
17+
spring.security.oauth2.client.registration.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.authorization-grant-type=client_credentials
18+
spring.security.oauth2.client.provider.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.token-uri={{{tokenUrl}}}
19+
{{/isApplication}}
20+
{{#isImplicit}}
21+
spring.security.oauth2.client.registration.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.authorization-grant-type=implicit
22+
spring.security.oauth2.client.provider.{{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}.authorization-uri={{{authorizationUrl}}}
23+
{{/isImplicit}}
24+
{{/isOAuth}}
25+
{{/authMethods}}

modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-cloud/pom-sb3.mustache

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,10 @@
9292
<artifactId>spring-cloud-starter-openfeign</artifactId>
9393
</dependency>
9494
<dependency>
95-
<groupId>org.springframework.cloud</groupId>
96-
<artifactId>spring-cloud-starter-oauth2</artifactId>
95+
<groupId>org.springframework.security</groupId>
96+
<artifactId>spring-security-oauth2-client</artifactId>
9797
{{^parentOverridden}}
98-
<version>2.2.5.RELEASE</version>
98+
<version>6.1.1</version>
9999
{{/parentOverridden}}
100100
</dependency>
101101
{{#withXml}}

modules/openapi-generator/src/main/resources/JavaSpring/libraries/spring-cloud/pom.mustache

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,10 @@
108108
<artifactId>spring-cloud-starter-openfeign</artifactId>
109109
</dependency>
110110
<dependency>
111-
<groupId>org.springframework.cloud</groupId>
112-
<artifactId>spring-cloud-starter-oauth2</artifactId>
111+
<groupId>org.springframework.security</groupId>
112+
<artifactId>spring-security-oauth2-client</artifactId>
113113
{{^parentOverridden}}
114-
<version>2.2.5.RELEASE</version>
114+
<version>5.7.8</version>
115115
{{/parentOverridden}}
116116
</dependency>
117117
{{#withXml}}

samples/client/petstore/spring-cloud-date-time/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@
5252
<artifactId>spring-cloud-starter-openfeign</artifactId>
5353
</dependency>
5454
<dependency>
55-
<groupId>org.springframework.cloud</groupId>
56-
<artifactId>spring-cloud-starter-oauth2</artifactId>
57-
<version>2.2.5.RELEASE</version>
55+
<groupId>org.springframework.security</groupId>
56+
<artifactId>spring-security-oauth2-client</artifactId>
57+
<version>5.7.8</version>
5858
</dependency>
5959
<dependency>
6060
<groupId>com.fasterxml.jackson.datatype</groupId>

0 commit comments

Comments
 (0)