Skip to content

Commit 1efb3a7

Browse files
Add support reactive OneTimeToken customization
Closes gh-16939 Signed-off-by: Max Batischev <[email protected]>
1 parent 9dcce61 commit 1efb3a7

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

Diff for: web/src/main/java/org/springframework/security/web/server/authentication/ott/DefaultServerGenerateOneTimeTokenRequestResolver.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package org.springframework.security.web.server.authentication.ott;
1818

1919
import java.time.Duration;
20+
import java.util.UUID;
21+
import java.util.function.Supplier;
2022

2123
import reactor.core.publisher.Mono;
2224

@@ -40,13 +42,15 @@ public final class DefaultServerGenerateOneTimeTokenRequestResolver
4042

4143
private Duration expiresIn = DEFAULT_EXPIRES_IN;
4244

45+
private Supplier<String> tokenValueFactory = () -> UUID.randomUUID().toString();
46+
4347
@Override
4448
public Mono<GenerateOneTimeTokenRequest> resolve(ServerWebExchange exchange) {
4549
// @formatter:off
4650
return exchange.getFormData()
4751
.mapNotNull((data) -> data.getFirst(USERNAME))
4852
.switchIfEmpty(Mono.empty())
49-
.map((username) -> new GenerateOneTimeTokenRequest(username, this.expiresIn));
53+
.map((username) -> new GenerateOneTimeTokenRequest(username, this.expiresIn, this.tokenValueFactory.get()));
5054
// @formatter:on
5155
}
5256

@@ -59,4 +63,14 @@ public void setExpiresIn(Duration expiresIn) {
5963
this.expiresIn = expiresIn;
6064
}
6165

66+
/**
67+
* Sets factory for token value generation
68+
* @param tokenValueFactory factory for token value generation
69+
* @since 6.5
70+
*/
71+
public void setTokenValueFactory(Supplier<String> tokenValueFactory) {
72+
Assert.notNull(tokenValueFactory, "tokenValueFactory cannot be null");
73+
this.tokenValueFactory = tokenValueFactory;
74+
}
75+
6276
}

Diff for: web/src/test/java/org/springframework/security/web/server/authentication/ott/DefaultServerGenerateOneTimeTokenRequestResolverTests.java

+12
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,16 @@ void resolveWhenExpiresInSetThenResolvesGenerateRequest() {
7171
assertThat(generateRequest.getExpiresIn()).isEqualTo(Duration.ofSeconds(600));
7272
}
7373

74+
@Test
75+
void resolveWhenTokenValueFactorySetThenResolvesGenerateRequest() {
76+
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.post("/ott/generate")
77+
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
78+
.body("username=user"));
79+
this.resolver.setTokenValueFactory(() -> "tokenValue");
80+
81+
GenerateOneTimeTokenRequest generateRequest = this.resolver.resolve(exchange).block();
82+
83+
assertThat(generateRequest.getTokenValue()).isEqualTo("tokenValue");
84+
}
85+
7486
}

0 commit comments

Comments
 (0)