1
1
/*
2
- * Copyright 2002-2018 the original author or authors.
2
+ * Copyright 2002-2019 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
21
21
import org .springframework .lang .Nullable ;
22
22
import org .springframework .security .core .Authentication ;
23
23
import org .springframework .security .core .context .SecurityContextHolder ;
24
- import org .springframework .security .oauth2 .client .ClientAuthorizationRequiredException ;
24
+ import org .springframework .security .oauth2 .client .AuthorizationCodeOAuth2AuthorizedClientProvider ;
25
+ import org .springframework .security .oauth2 .client .ClientCredentialsOAuth2AuthorizedClientProvider ;
26
+ import org .springframework .security .oauth2 .client .DelegatingOAuth2AuthorizedClientProvider ;
27
+ import org .springframework .security .oauth2 .client .OAuth2AuthorizationContext ;
25
28
import org .springframework .security .oauth2 .client .OAuth2AuthorizedClient ;
29
+ import org .springframework .security .oauth2 .client .OAuth2AuthorizedClientProvider ;
26
30
import org .springframework .security .oauth2 .client .annotation .RegisteredOAuth2AuthorizedClient ;
27
31
import org .springframework .security .oauth2 .client .authentication .OAuth2AuthenticationToken ;
28
32
import org .springframework .security .oauth2 .client .endpoint .DefaultClientCredentialsTokenResponseClient ;
31
35
import org .springframework .security .oauth2 .client .registration .ClientRegistration ;
32
36
import org .springframework .security .oauth2 .client .registration .ClientRegistrationRepository ;
33
37
import org .springframework .security .oauth2 .client .web .OAuth2AuthorizedClientRepository ;
34
- import org .springframework .security .oauth2 .core .AuthorizationGrantType ;
35
- import org .springframework .security .oauth2 .core .endpoint .OAuth2AccessTokenResponse ;
36
38
import org .springframework .util .Assert ;
37
39
import org .springframework .util .StringUtils ;
38
40
import org .springframework .web .bind .support .WebDataBinderFactory ;
66
68
public final class OAuth2AuthorizedClientArgumentResolver implements HandlerMethodArgumentResolver {
67
69
private final ClientRegistrationRepository clientRegistrationRepository ;
68
70
private final OAuth2AuthorizedClientRepository authorizedClientRepository ;
69
- private OAuth2AccessTokenResponseClient <OAuth2ClientCredentialsGrantRequest > clientCredentialsTokenResponseClient =
70
- new DefaultClientCredentialsTokenResponseClient ();
71
+ private OAuth2AuthorizedClientProvider authorizedClientProvider ;
71
72
72
73
/**
73
74
* Constructs an {@code OAuth2AuthorizedClientArgumentResolver} using the provided parameters.
@@ -81,6 +82,7 @@ public OAuth2AuthorizedClientArgumentResolver(ClientRegistrationRepository clien
81
82
Assert .notNull (authorizedClientRepository , "authorizedClientRepository cannot be null" );
82
83
this .clientRegistrationRepository = clientRegistrationRepository ;
83
84
this .authorizedClientRepository = authorizedClientRepository ;
85
+ this .authorizedClientProvider = createAuthorizedClientProvider (new DefaultClientCredentialsTokenResponseClient ());
84
86
}
85
87
86
88
@ Override
@@ -119,16 +121,20 @@ public Object resolveArgument(MethodParameter parameter,
119
121
return null ;
120
122
}
121
123
122
- if (AuthorizationGrantType .AUTHORIZATION_CODE .equals (clientRegistration .getAuthorizationGrantType ())) {
123
- throw new ClientAuthorizationRequiredException (clientRegistrationId );
124
- }
124
+ HttpServletResponse servletResponse = webRequest .getNativeResponse (HttpServletResponse .class );
125
125
126
- if (AuthorizationGrantType .CLIENT_CREDENTIALS .equals (clientRegistration .getAuthorizationGrantType ())) {
127
- HttpServletResponse servletResponse = webRequest .getNativeResponse (HttpServletResponse .class );
128
- authorizedClient = this .authorizeClientCredentialsClient (clientRegistration , servletRequest , servletResponse );
126
+ OAuth2AuthorizationContext .Builder authorizationContextBuilder = OAuth2AuthorizationContext .authorize (clientRegistration );
127
+ if (principal == null ) {
128
+ authorizationContextBuilder .principal ("anonymousUser" );
129
+ } else {
130
+ authorizationContextBuilder .principal (principal );
129
131
}
132
+ OAuth2AuthorizationContext authorizationContext = authorizationContextBuilder
133
+ .attribute (HttpServletRequest .class .getName (), servletRequest )
134
+ .attribute (HttpServletResponse .class .getName (), servletResponse )
135
+ .build ();
130
136
131
- return authorizedClient ;
137
+ return this . authorizedClientProvider . authorize ( authorizationContext ) ;
132
138
}
133
139
134
140
private String resolveClientRegistrationId (MethodParameter parameter ) {
@@ -149,37 +155,37 @@ private String resolveClientRegistrationId(MethodParameter parameter) {
149
155
return clientRegistrationId ;
150
156
}
151
157
152
- private OAuth2AuthorizedClient authorizeClientCredentialsClient (ClientRegistration clientRegistration ,
153
- HttpServletRequest request , HttpServletResponse response ) {
154
- OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest =
155
- new OAuth2ClientCredentialsGrantRequest (clientRegistration );
156
- OAuth2AccessTokenResponse tokenResponse =
157
- this .clientCredentialsTokenResponseClient .getTokenResponse (clientCredentialsGrantRequest );
158
-
159
- Authentication principal = SecurityContextHolder .getContext ().getAuthentication ();
160
-
161
- OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient (
162
- clientRegistration ,
163
- (principal != null ? principal .getName () : "anonymousUser" ),
164
- tokenResponse .getAccessToken ());
165
-
166
- this .authorizedClientRepository .saveAuthorizedClient (
167
- authorizedClient ,
168
- principal ,
169
- request ,
170
- response );
171
-
172
- return authorizedClient ;
158
+ /**
159
+ * Sets the {@link OAuth2AuthorizedClientProvider} used for authorizing (or re-authorizing) an OAuth 2.0 Client.
160
+ *
161
+ * @since 5.2
162
+ * @param authorizedClientProvider the {@link OAuth2AuthorizedClientProvider} used for authorizing (or re-authorizing) an OAuth 2.0 Client.
163
+ */
164
+ public void setAuthorizedClientProvider (OAuth2AuthorizedClientProvider authorizedClientProvider ) {
165
+ Assert .notNull (authorizedClientProvider , "authorizedClientProvider cannot be null" );
166
+ this .authorizedClientProvider = authorizedClientProvider ;
173
167
}
174
168
175
169
/**
176
170
* Sets the client used when requesting an access token credential at the Token Endpoint for the {@code client_credentials} grant.
177
171
*
172
+ * @deprecated Use {@link #setAuthorizedClientProvider(OAuth2AuthorizedClientProvider)} instead by providing it an instance of {@link ClientCredentialsOAuth2AuthorizedClientProvider} configured with a {@link ClientCredentialsOAuth2AuthorizedClientProvider#setAccessTokenResponseClient(OAuth2AccessTokenResponseClient) DefaultClientCredentialsTokenResponseClient} or a custom one.
173
+ *
178
174
* @param clientCredentialsTokenResponseClient the client used when requesting an access token credential at the Token Endpoint for the {@code client_credentials} grant
179
175
*/
176
+ @ Deprecated
180
177
public final void setClientCredentialsTokenResponseClient (
181
178
OAuth2AccessTokenResponseClient <OAuth2ClientCredentialsGrantRequest > clientCredentialsTokenResponseClient ) {
182
179
Assert .notNull (clientCredentialsTokenResponseClient , "clientCredentialsTokenResponseClient cannot be null" );
183
- this .clientCredentialsTokenResponseClient = clientCredentialsTokenResponseClient ;
180
+ this .authorizedClientProvider = createAuthorizedClientProvider (clientCredentialsTokenResponseClient );
181
+ }
182
+
183
+ private OAuth2AuthorizedClientProvider createAuthorizedClientProvider (
184
+ OAuth2AccessTokenResponseClient <OAuth2ClientCredentialsGrantRequest > clientCredentialsTokenResponseClient ) {
185
+ ClientCredentialsOAuth2AuthorizedClientProvider clientCredentialsAuthorizedClientProvider =
186
+ new ClientCredentialsOAuth2AuthorizedClientProvider (this .clientRegistrationRepository , this .authorizedClientRepository );
187
+ clientCredentialsAuthorizedClientProvider .setAccessTokenResponseClient (clientCredentialsTokenResponseClient );
188
+ return new DelegatingOAuth2AuthorizedClientProvider (
189
+ new AuthorizationCodeOAuth2AuthorizedClientProvider (), clientCredentialsAuthorizedClientProvider );
184
190
}
185
191
}
0 commit comments