Skip to content

Commit 53c38fc

Browse files
committed
Add ServerWebExchange parameter to AuthorizationRequestCustomizer
Closes gh-16306
1 parent 95ec49a commit 53c38fc

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

Diff for: oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/web/server/DefaultServerOAuth2AuthorizationRequestResolver.java

+22-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Base64;
2323
import java.util.HashMap;
2424
import java.util.Map;
25+
import java.util.function.BiConsumer;
2526
import java.util.function.Consumer;
2627

2728
import reactor.core.publisher.Mono;
@@ -92,7 +93,8 @@ public class DefaultServerOAuth2AuthorizationRequestResolver implements ServerOA
9293

9394
private final ReactiveClientRegistrationRepository clientRegistrationRepository;
9495

95-
private Consumer<OAuth2AuthorizationRequest.Builder> authorizationRequestCustomizer = (customizer) -> {
96+
private BiConsumer<OAuth2AuthorizationRequest.Builder, ServerWebExchange> authorizationRequestCustomizer = (
97+
customizer, exchange) -> {
9698
};
9799

98100
/**
@@ -148,11 +150,29 @@ public Mono<OAuth2AuthorizationRequest> resolve(ServerWebExchange exchange, Stri
148150
* @param authorizationRequestCustomizer the {@code Consumer} to be provided the
149151
* {@link OAuth2AuthorizationRequest.Builder}
150152
* @since 5.3
153+
* @deprecated Use {@link #setAuthorizationRequestCustomizer(BiConsumer) } instead
151154
* @see OAuth2AuthorizationRequestCustomizers
152155
*/
156+
@Deprecated
153157
public final void setAuthorizationRequestCustomizer(
154158
Consumer<OAuth2AuthorizationRequest.Builder> authorizationRequestCustomizer) {
155159
Assert.notNull(authorizationRequestCustomizer, "authorizationRequestCustomizer cannot be null");
160+
this.authorizationRequestCustomizer = (customizer, exchange) -> authorizationRequestCustomizer
161+
.accept(customizer);
162+
}
163+
164+
/**
165+
* Sets the {@code BiConsumer} to be provided the
166+
* {@link OAuth2AuthorizationRequest.Builder} and {@link ServerWebExchange} allowing
167+
* for further customizations.
168+
* @param authorizationRequestCustomizer the {@code BiConsumer} to be provided the
169+
* {@link OAuth2AuthorizationRequest.Builder} and {@link ServerWebExchange}
170+
* @since 6.5
171+
* @see OAuth2AuthorizationRequestCustomizers
172+
*/
173+
public final void setAuthorizationRequestCustomizer(
174+
BiConsumer<OAuth2AuthorizationRequest.Builder, ServerWebExchange> authorizationRequestCustomizer) {
175+
Assert.notNull(authorizationRequestCustomizer, "authorizationRequestCustomizer cannot be null");
156176
this.authorizationRequestCustomizer = authorizationRequestCustomizer;
157177
}
158178

@@ -175,7 +195,7 @@ private OAuth2AuthorizationRequest authorizationRequest(ServerWebExchange exchan
175195
.state(DEFAULT_STATE_GENERATOR.generateKey());
176196
// @formatter:on
177197

178-
this.authorizationRequestCustomizer.accept(builder);
198+
this.authorizationRequestCustomizer.accept(builder, exchange);
179199

180200
return builder.build();
181201
}

Diff for: oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/web/server/DefaultServerOAuth2AuthorizationRequestResolverTests.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.security.oauth2.client.web.server;
1818

19+
import java.util.function.Consumer;
20+
1921
import org.junit.jupiter.api.BeforeEach;
2022
import org.junit.jupiter.api.Test;
2123
import org.junit.jupiter.api.extension.ExtendWith;
@@ -68,7 +70,8 @@ public void setup() {
6870

6971
@Test
7072
public void setAuthorizationRequestCustomizerWhenNullThenThrowIllegalArgumentException() {
71-
assertThatIllegalArgumentException().isThrownBy(() -> this.resolver.setAuthorizationRequestCustomizer(null));
73+
assertThatIllegalArgumentException().isThrownBy(() -> this.resolver
74+
.setAuthorizationRequestCustomizer((Consumer<OAuth2AuthorizationRequest.Builder>) null));
7275
}
7376

7477
@Test
@@ -254,6 +257,18 @@ public void resolveWhenAuthorizationRequestCustomizerOverridesParameterThenQuery
254257
+ "nonce=([a-zA-Z0-9\\-\\.\\_\\~]){43}&" + "appid=client-id");
255258
}
256259

260+
@Test
261+
public void resolveWhenAuthorizationRequestCustomizerAdditionParameterFromRequest() {
262+
given(this.clientRegistrationRepository.findByRegistrationId(any()))
263+
.willReturn(Mono.just(TestClientRegistrations.clientRegistration().scope(OidcScopes.OPENID).build()));
264+
this.resolver.setAuthorizationRequestCustomizer((builder, exchange) -> builder.parameters((params) -> {
265+
params.put("aa", exchange.getRequest().getQueryParams().getFirst("a"));
266+
params.put("bb", exchange.getRequest().getQueryParams().getFirst("b"));
267+
}));
268+
OAuth2AuthorizationRequest authorizationRequest = resolve("/oauth2/authorization/registration-id?a=A&b=B");
269+
assertThat(authorizationRequest.getAuthorizationRequestUri()).contains("aa=A&bb=B");
270+
}
271+
257272
private OAuth2AuthorizationRequest resolve(String path) {
258273
ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get(path));
259274
return this.resolver.resolve(exchange).block();

0 commit comments

Comments
 (0)