Skip to content

Commit 20e2ba3

Browse files
committed
Add reactive handle method to ServerCsrfTokenRequestHandler
Adds a default reactive handle method returning Mono<Void> and deprecates the legacy void handle method in preparation for Spring Security 8. Closes: gh-16869 Signed-off-by: Andrey Litvitski <[email protected]>
1 parent 42e1e9f commit 20e2ba3

File tree

4 files changed

+21
-4
lines changed

4 files changed

+21
-4
lines changed

config/src/test/java/org/springframework/security/config/web/server/ServerHttpSecurityTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,7 @@ public void postWhenCustomRequestHandlerThenUsed() {
552552
given(this.csrfTokenRepository.loadToken(any(ServerWebExchange.class))).willReturn(Mono.just(csrfToken));
553553
given(this.csrfTokenRepository.generateToken(any(ServerWebExchange.class))).willReturn(Mono.empty());
554554
ServerCsrfTokenRequestHandler requestHandler = mock(ServerCsrfTokenRequestHandler.class);
555+
given(requestHandler.handleAsync(any(ServerWebExchange.class), any())).willReturn(Mono.empty());
555556
given(requestHandler.resolveCsrfTokenValue(any(ServerWebExchange.class), any(CsrfToken.class)))
556557
.willReturn(Mono.just(csrfToken.getToken()));
557558
// @formatter:off
@@ -564,7 +565,7 @@ public void postWhenCustomRequestHandlerThenUsed() {
564565
client.post().uri("/").exchange().expectStatus().isOk();
565566
verify(this.csrfTokenRepository, times(2)).loadToken(any(ServerWebExchange.class));
566567
verify(this.csrfTokenRepository).generateToken(any(ServerWebExchange.class));
567-
verify(requestHandler).handle(any(ServerWebExchange.class), any());
568+
verify(requestHandler).handleAsync(any(ServerWebExchange.class), any());
568569
verify(requestHandler).resolveCsrfTokenValue(any(ServerWebExchange.class), any());
569570
}
570571

web/src/main/java/org/springframework/security/web/server/csrf/CsrfWebFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
* @author Rob Winch
6161
* @author Parikshit Dutta
6262
* @author Steve Riesenberg
63+
* @author Andrey Litvitski
6364
* @since 5.0
6465
*/
6566
public class CsrfWebFilter implements WebFilter {
@@ -147,8 +148,7 @@ private Mono<Boolean> containsValidCsrfToken(ServerWebExchange exchange, CsrfTok
147148
private Mono<Void> continueFilterChain(ServerWebExchange exchange, WebFilterChain chain) {
148149
return Mono.defer(() -> {
149150
Mono<CsrfToken> csrfToken = csrfToken(exchange);
150-
this.requestHandler.handle(exchange, csrfToken);
151-
return chain.filter(exchange);
151+
return this.requestHandler.handleAsync(exchange, csrfToken).then(chain.filter(exchange));
152152
});
153153
}
154154

web/src/main/java/org/springframework/security/web/server/csrf/ServerCsrfTokenRequestHandler.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
* made available to the application through exchange attributes.
3030
*
3131
* @author Steve Riesenberg
32+
* @author Andrey Litvitski
3233
* @since 5.8
3334
* @see ServerCsrfTokenRequestAttributeHandler
3435
*/
@@ -40,9 +41,23 @@ public interface ServerCsrfTokenRequestHandler extends ServerCsrfTokenRequestRes
4041
* @param exchange the {@code ServerWebExchange} with the request being handled
4142
* @param csrfToken the {@code Mono<CsrfToken>} created by the
4243
* {@link ServerCsrfTokenRepository}
44+
* @deprecated since 7.0 in favor of {@link #handleAsync(ServerWebExchange, Mono)}
4345
*/
46+
@Deprecated(since = "7.0", forRemoval = true)
4447
void handle(ServerWebExchange exchange, Mono<CsrfToken> csrfToken);
4548

49+
/**
50+
* Handles a request using a {@link CsrfToken}.
51+
* @param exchange the {@code ServerWebExchange} with the request being handled
52+
* @param csrfToken the {@code Mono<CsrfToken>} created by the
53+
* {@link ServerCsrfTokenRepository}
54+
* @return a {@code Mono} that completes when handling is finished
55+
*/
56+
default Mono<Void> handleAsync(ServerWebExchange exchange, Mono<CsrfToken> csrfToken) {
57+
handle(exchange, csrfToken);
58+
return Mono.empty();
59+
}
60+
4661
@Override
4762
default Mono<String> resolveCsrfTokenValue(ServerWebExchange exchange, CsrfToken csrfToken) {
4863
Assert.notNull(exchange, "exchange cannot be null");

web/src/test/java/org/springframework/security/web/server/csrf/CsrfWebFilterTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ public void filterWhenPostAndEstablishedCsrfTokenAndHeaderValidTokenThenContinue
164164
@Test
165165
public void filterWhenRequestHandlerSetThenUsed() {
166166
ServerCsrfTokenRequestHandler requestHandler = mock(ServerCsrfTokenRequestHandler.class);
167+
given(requestHandler.handleAsync(any(ServerWebExchange.class), any())).willReturn(Mono.empty());
167168
given(requestHandler.resolveCsrfTokenValue(any(ServerWebExchange.class), any(CsrfToken.class)))
168169
.willReturn(Mono.just(this.token.getToken()));
169170
this.csrfFilter.setRequestHandler(requestHandler);
@@ -179,7 +180,7 @@ public void filterWhenRequestHandlerSetThenUsed() {
179180
StepVerifier.create(result).verifyComplete();
180181
chainResult.assertWasSubscribed();
181182

182-
verify(requestHandler).handle(eq(this.post), any());
183+
verify(requestHandler).handleAsync(eq(this.post), any());
183184
verify(requestHandler).resolveCsrfTokenValue(this.post, this.token);
184185
}
185186

0 commit comments

Comments
 (0)