@@ -8,20 +8,14 @@ import feign.auth.BasicAuthRequestInterceptor
88import org.springframework.beans.factory.annotation.Value
99import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
1010{ {/-first} }
11- { {^useSpringBoot4} }
12- { {#isOAuth} }
13- import org.springframework.boot.context.properties.ConfigurationProperties
14- { {/isOAuth} }
15- { {/useSpringBoot4} }
11+ { {^useSpringBoot4} }{ {^useSpringBoot3} }{ {#isOAuth} }import org.springframework.boot.context.properties.ConfigurationProperties{ {/isOAuth} }{ {/useSpringBoot3} }{ {/useSpringBoot4} }
1612{ {/authMethods} }
17- { {^useSpringBoot4} }
18- import org.springframework.boot.context.properties.EnableConfigurationProperties
19- { {/useSpringBoot4} }
13+ { {^useSpringBoot4} }{ {^useSpringBoot3} }import org.springframework.boot.context.properties.EnableConfigurationProperties{ {/useSpringBoot3} }{ {/useSpringBoot4} }
2014{ {#hasAuthMethods} }
2115import org.springframework.context.annotation.Bean
2216{ {/hasAuthMethods} }
2317import org.springframework.context.annotation.Configuration
24- { {^useSpringBoot4} }
18+ { {^useSpringBoot4} }{ {^useSpringBoot3 } }
2519{ {#authMethods} }
2620{ {#isOAuth} }
2721import org.springframework.cloud.openfeign.security.OAuth2FeignRequestInterceptor
@@ -41,7 +35,24 @@ import org.springframework.security.oauth2.client.token.grant.password.ResourceO
4135{ {/isPassword} }
4236{ {/isOAuth} }
4337{ {/authMethods} }
44- { {/useSpringBoot4} }
38+ { {/useSpringBoot3} }{ {/useSpringBoot4} }
39+ { {#useSpringBoot3} }
40+ { {#hasOAuthMethods} }
41+ import org.springframework.security.authentication.AnonymousAuthenticationToken
42+ import org.springframework.security.oauth2.client.AuthorizedClientServiceOAuth2AuthorizedClientManager
43+ import org.springframework.security.oauth2.client.OAuth2AuthorizeRequest
44+ import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager
45+ import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService
46+ import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository
47+ import org.springframework.security.oauth2.core.OAuth2AuthenticationException
48+ import org.springframework.security.oauth2.core.OAuth2AccessToken
49+ import org.springframework.security.core.authority.AuthorityUtils
50+ import org.springframework.http.HttpHeaders
51+
52+ import feign.RequestInterceptor
53+ import feign.RequestTemplate
54+ { {/hasOAuthMethods} }
55+ { {/useSpringBoot3} }
4556{ {#useSpringBoot4} }
4657{ {#hasOAuthMethods} }
4758import org.springframework.security.authentication.AnonymousAuthenticationToken
@@ -60,10 +71,8 @@ import feign.RequestTemplate
6071{ {/hasOAuthMethods} }
6172{ {/useSpringBoot4} }
6273
63- @Configuration
64- { {^useSpringBoot4} }
65- @EnableConfigurationProperties
66- { {/useSpringBoot4} }
74+ @Configuration{ {^useSpringBoot4} }{ {^useSpringBoot3} }
75+ @EnableConfigurationProperties{ {/useSpringBoot3} }{ {/useSpringBoot4} }
6776class ClientConfiguration {
6877
6978 {{#authMethods} }
@@ -93,7 +102,7 @@ class ClientConfiguration {
93102
94103 { {/isApiKey} }
95104 { {#isOAuth} }
96- { {^useSpringBoot4} }
105+ { {^useSpringBoot4} }{ {^useSpringBoot3 } }
97106 @Bean
98107 @ConditionalOnProperty("{ {#lambda.lowercase} }{ {{title} }}{ {/lambda.lowercase} }.security.{ {{name} }}.client-id")
99108 fun { {#lambda.camelcase} }{ {{name} }}{ {/lambda.camelcase} }RequestInterceptor(oAuth2ClientContext: OAuth2ClientContext): OAuth2FeignRequestInterceptor {
@@ -151,7 +160,29 @@ class ClientConfiguration {
151160 }
152161
153162 { {/isImplicit} }
154- { {/useSpringBoot4} }
163+ { {/useSpringBoot3} }{ {/useSpringBoot4} }
164+ { {#useSpringBoot3} }
165+ @Bean
166+ @ConditionalOnProperty(prefix = "spring.security.oauth2.client.registration.{ {{name} }}{ {#lambda.pascalcase} }{ {{flow} }}{ {/lambda.pascalcase} }", name = ["enabled"], havingValue = "true")
167+ fun { {{flow} }}OAuth2RequestInterceptor({ {{flow} }}AuthorizedClientManager: OAuth2AuthorizedClientManager): OAuth2RequestInterceptor {
168+ return OAuth2RequestInterceptor(
169+ OAuth2AuthorizeRequest.withClientRegistrationId(" {{{name}}}{{#lambda.pascalcase}}{{{flow}}}{{/lambda.pascalcase}}" )
170+ .principal(AnonymousAuthenticationToken(CLIENT_PRINCIPAL_{{#lambda.uppercase} }{ {{flow} }}{ {/lambda.uppercase} }, CLIENT_PRINCIPAL_{ {#lambda.uppercase} }{ {{flow} }}{ {/lambda.uppercase} }, AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS")))
171+ .build(),
172+ { {{flow} }}AuthorizedClientManager
173+ )
174+ }
175+
176+ @Bean
177+ @ConditionalOnProperty(prefix = "spring.security.oauth2.client.registration.{ {{name} }}{ {#lambda.pascalcase} }{ {{flow} }}{ {/lambda.pascalcase} }", name = ["enabled"], havingValue = "true")
178+ fun { {{flow} }}AuthorizedClientManager(
179+ clientRegistrationRepository: ClientRegistrationRepository,
180+ authorizedClientService: OAuth2AuthorizedClientService
181+ ): OAuth2AuthorizedClientManager {
182+ return AuthorizedClientServiceOAuth2AuthorizedClientManager(clientRegistrationRepository, authorizedClientService)
183+ }
184+
185+ { {/useSpringBoot3} }
155186{ {#useSpringBoot4} }
156187 @Bean
157188 @ConditionalOnProperty(prefix = "spring.security.oauth2.client.registration.{ {{name} }}{ {#lambda.pascalcase} }{ {{flow} }}{ {/lambda.pascalcase} }", name = ["enabled"], havingValue = "true")
@@ -176,6 +207,38 @@ class ClientConfiguration {
176207{ {/useSpringBoot4} }
177208 { {/isOAuth} }
178209 { {/authMethods} }
210+ { {#useSpringBoot3} }
211+ { {#hasOAuthMethods} }
212+ class OAuth2RequestInterceptor(
213+ private val oAuth2AuthorizeRequest: OAuth2AuthorizeRequest,
214+ private val oAuth2AuthorizedClientManager: OAuth2AuthorizedClientManager
215+ ) : RequestInterceptor {
216+
217+ override fun apply(template: RequestTemplate) {
218+ template.header(HttpHeaders.AUTHORIZATION, getBearerToken())
219+ }
220+
221+ fun getAccessToken(): OAuth2AccessToken {
222+ val authorizedClient = oAuth2AuthorizedClientManager.authorize(oAuth2AuthorizeRequest)
223+ ?: throw OAuth2AuthenticationException(" Client failed to authenticate" )
224+ return authorizedClient.accessToken
225+ }
226+
227+ fun getBearerToken(): String {
228+ val accessToken = getAccessToken()
229+ return String.format(java.util.Locale.ROOT, " %s %s" , accessToken.tokenType?.value, accessToken.tokenValue)
230+ }
231+ }
232+
233+ companion object {
234+ {{#authMethods} }
235+ { {#isOAuth} }
236+ private const val CLIENT_PRINCIPAL_{ {#lambda.uppercase} }{ {{flow} }}{ {/lambda.uppercase} } = "oauth2FeignClient"
237+ { {/isOAuth} }
238+ { {/authMethods} }
239+ }
240+ { {/hasOAuthMethods} }
241+ { {/useSpringBoot3} }
179242{ {#useSpringBoot4} }
180243 { {#hasOAuthMethods} }
181244 class OAuth2RequestInterceptor(
0 commit comments