Skip to content

Commit dd0107d

Browse files
committed
Improve CSRF token handling and logging
Align log messages between servlet and reactive implementations Signed-off-by: yybmion <[email protected]>
1 parent a913f1c commit dd0107d

8 files changed

+35
-26
lines changed

web/src/main/java/org/springframework/security/web/csrf/CsrfTokenRequestAttributeHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020

2121
import jakarta.servlet.http.HttpServletRequest;
2222
import jakarta.servlet.http.HttpServletResponse;
23-
2423
import org.apache.commons.logging.Log;
2524
import org.apache.commons.logging.LogFactory;
25+
2626
import org.springframework.core.log.LogMessage;
2727
import org.springframework.util.Assert;
2828

web/src/main/java/org/springframework/security/web/csrf/CsrfTokenRequestHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616

1717
package org.springframework.security.web.csrf;
1818

19+
import java.util.function.Supplier;
20+
1921
import jakarta.servlet.http.HttpServletRequest;
2022
import jakarta.servlet.http.HttpServletResponse;
21-
import java.util.function.Supplier;
23+
2224
import org.springframework.core.log.LogMessage;
2325
import org.springframework.util.Assert;
2426

web/src/main/java/org/springframework/security/web/csrf/CsrfTokenRequestHandlerLoggerHolder.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@
2121

2222
/**
2323
* Utility class for holding the logger for {@link CsrfTokenRequestHandler}
24-
*
25-
* @since 5.8
2624
*/
27-
class CsrfTokenRequestHandlerLoggerHolder {
25+
final class CsrfTokenRequestHandlerLoggerHolder {
2826

2927
static final Log logger = LogFactory.getLog(CsrfTokenRequestHandler.class);
3028

29+
private CsrfTokenRequestHandlerLoggerHolder() {
30+
}
31+
3132
}

web/src/main/java/org/springframework/security/web/csrf/XorCsrfTokenRequestAttributeHandler.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616

1717
package org.springframework.security.web.csrf;
1818

19-
import jakarta.servlet.http.HttpServletRequest;
20-
import jakarta.servlet.http.HttpServletResponse;
2119
import java.security.SecureRandom;
2220
import java.util.Base64;
2321
import java.util.function.Supplier;
22+
23+
import jakarta.servlet.http.HttpServletRequest;
24+
import jakarta.servlet.http.HttpServletResponse;
2425
import org.apache.commons.logging.Log;
2526
import org.apache.commons.logging.LogFactory;
27+
2628
import org.springframework.core.log.LogMessage;
2729
import org.springframework.security.crypto.codec.Utf8;
2830
import org.springframework.util.Assert;
@@ -77,9 +79,7 @@ public String resolveCsrfTokenValue(HttpServletRequest request, CsrfToken csrfTo
7779
if (actualToken == null) {
7880
return null;
7981
}
80-
String tokenValue = getTokenValue(actualToken, csrfToken.getToken());
81-
82-
return tokenValue;
82+
return getTokenValue(actualToken, csrfToken.getToken());
8383
}
8484

8585
private static String getTokenValue(String actualToken, String token) {

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818

1919
import org.apache.commons.logging.Log;
2020
import org.apache.commons.logging.LogFactory;
21-
import org.springframework.core.log.LogMessage;
2221
import reactor.core.publisher.Mono;
2322

23+
import org.springframework.core.log.LogMessage;
2424
import org.springframework.http.HttpHeaders;
2525
import org.springframework.http.MediaType;
2626
import org.springframework.http.codec.multipart.FormFieldPart;
@@ -48,8 +48,7 @@ public void handle(ServerWebExchange exchange, Mono<CsrfToken> csrfToken) {
4848
Assert.notNull(exchange, "exchange cannot be null");
4949
Assert.notNull(csrfToken, "csrfToken cannot be null");
5050
exchange.getAttributes().put(CsrfToken.class.getName(), csrfToken);
51-
logger.trace(LogMessage.format("Wrote a CSRF token to the following exchange attributes: [%s]",
52-
CsrfToken.class.getName()));
51+
logger.trace(LogMessage.format("Wrote a CSRF token to the [%s] exchange attribute", CsrfToken.class.getName()));
5352
}
5453

5554
@Override

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616

1717
package org.springframework.security.web.server.csrf;
1818

19-
import org.springframework.core.log.LogMessage;
2019
import reactor.core.publisher.Mono;
2120

21+
import org.springframework.core.log.LogMessage;
2222
import org.springframework.util.Assert;
2323
import org.springframework.web.server.ServerWebExchange;
2424

@@ -47,21 +47,25 @@ public interface ServerCsrfTokenRequestHandler extends ServerCsrfTokenRequestRes
4747
default Mono<String> resolveCsrfTokenValue(ServerWebExchange exchange, CsrfToken csrfToken) {
4848
Assert.notNull(exchange, "exchange cannot be null");
4949
Assert.notNull(csrfToken, "csrfToken cannot be null");
50+
51+
String headerName = csrfToken.getHeaderName();
52+
String parameterName = csrfToken.getParameterName();
53+
5054
return exchange.getFormData().flatMap((data) -> {
51-
String token = data.getFirst(csrfToken.getParameterName());
55+
String token = data.getFirst(parameterName);
5256
if (token != null) {
5357
return Mono.just(token);
5458
}
55-
ServerCsrfTokenRequestHandlerLoggerHolder.logger.trace(LogMessage
56-
.format("Did not find a CSRF token in the [%s] request parameter", csrfToken.getParameterName()));
59+
ServerCsrfTokenRequestHandlerLoggerHolder.logger
60+
.trace(LogMessage.format("Did not find a CSRF token in the [%s] request parameter", parameterName));
5761
return Mono.empty();
5862
}).switchIfEmpty(Mono.defer(() -> {
59-
String token = exchange.getRequest().getHeaders().getFirst(csrfToken.getHeaderName());
63+
String token = exchange.getRequest().getHeaders().getFirst(headerName);
6064
if (token != null) {
6165
return Mono.just(token);
6266
}
63-
ServerCsrfTokenRequestHandlerLoggerHolder.logger.trace(LogMessage
64-
.format("Did not find a CSRF token in the [%s] request header", csrfToken.getHeaderName()));
67+
ServerCsrfTokenRequestHandlerLoggerHolder.logger
68+
.trace(LogMessage.format("Did not find a CSRF token in the [%s] request header", headerName));
6569
return Mono.empty();
6670
}));
6771
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@
2121

2222
/**
2323
* Utility class for holding the logger for {@link ServerCsrfTokenRequestHandler}
24-
*
25-
* @since 5.8
2624
*/
27-
class ServerCsrfTokenRequestHandlerLoggerHolder {
25+
final class ServerCsrfTokenRequestHandlerLoggerHolder {
2826

2927
static final Log logger = LogFactory.getLog(ServerCsrfTokenRequestHandler.class);
3028

29+
private ServerCsrfTokenRequestHandlerLoggerHolder() {
30+
}
31+
3132
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121

2222
import org.apache.commons.logging.Log;
2323
import org.apache.commons.logging.LogFactory;
24-
import org.springframework.core.log.LogMessage;
2524
import reactor.core.publisher.Mono;
2625

26+
import org.springframework.core.log.LogMessage;
2727
import org.springframework.security.crypto.codec.Utf8;
2828
import org.springframework.util.Assert;
2929
import org.springframework.web.server.ServerWebExchange;
@@ -78,14 +78,16 @@ private static String getTokenValue(String actualToken, String token) {
7878
actualBytes = Base64.getUrlDecoder().decode(actualToken);
7979
}
8080
catch (Exception ex) {
81-
logger.trace(LogMessage.format("Failed to find CSRF token since Base64 decoding failed"), ex);
81+
logger.trace(LogMessage.format("Not returning the CSRF token since it's not Base64-encoded"), ex);
8282
return null;
8383
}
8484

8585
byte[] tokenBytes = Utf8.encode(token);
8686
int tokenSize = tokenBytes.length;
8787
if (actualBytes.length != tokenSize * 2) {
88-
logger.trace(LogMessage.format("Failed to validate CSRF token since token length is invalid"));
88+
logger.trace(LogMessage.format(
89+
"Not returning the CSRF token since its Base64-decoded length (%d) is not equal to (%d)",
90+
actualBytes.length, tokenSize * 2));
8991
return null;
9092
}
9193

0 commit comments

Comments
 (0)