mirror of
https://github.com/spring-projects/spring-security.git
synced 2025-07-23 02:33:30 +00:00
ServerCsrfTokenRepository.saveToken return Mono<CsrfToken>
Fixes gh-4800
This commit is contained in:
parent
3f18881493
commit
776364d403
@ -46,7 +46,7 @@ public interface ServerCsrfTokenRepository {
|
|||||||
* @param exchange the {@link ServerWebExchange} to use
|
* @param exchange the {@link ServerWebExchange} to use
|
||||||
* @param token the {@link CsrfToken} to save or null to delete
|
* @param token the {@link CsrfToken} to save or null to delete
|
||||||
*/
|
*/
|
||||||
Mono<Void> saveToken(ServerWebExchange exchange, CsrfToken token);
|
Mono<CsrfToken> saveToken(ServerWebExchange exchange, CsrfToken token);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads the expected {@link CsrfToken} from the {@link ServerWebExchange}
|
* Loads the expected {@link CsrfToken} from the {@link ServerWebExchange}
|
||||||
|
@ -50,28 +50,29 @@ public class WebSessionServerCsrfTokenRepository
|
|||||||
@Override
|
@Override
|
||||||
public Mono<CsrfToken> generateToken(ServerWebExchange exchange) {
|
public Mono<CsrfToken> generateToken(ServerWebExchange exchange) {
|
||||||
return Mono.defer(() -> Mono.just(createCsrfToken()))
|
return Mono.defer(() -> Mono.just(createCsrfToken()))
|
||||||
.flatMap(token -> save(exchange, token));
|
.flatMap(token -> saveToken(exchange, token));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<Void> saveToken(ServerWebExchange exchange, CsrfToken token) {
|
public Mono<CsrfToken> saveToken(ServerWebExchange exchange, CsrfToken token) {
|
||||||
return save(exchange, token)
|
|
||||||
.then();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Mono<CsrfToken> save(ServerWebExchange exchange, CsrfToken token) {
|
|
||||||
return exchange.getSession()
|
return exchange.getSession()
|
||||||
.map(WebSession::getAttributes)
|
.map(WebSession::getAttributes)
|
||||||
.flatMap( attrs -> save(attrs, token));
|
.flatMap( attrs -> save(attrs, token));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Mono<CsrfToken> save(Map<String,Object> attributes, CsrfToken token) {
|
private Mono<CsrfToken> save(Map<String,Object> attributes, CsrfToken token) {
|
||||||
|
return Mono.defer(() -> {
|
||||||
|
putToken(attributes, token);
|
||||||
|
return Mono.justOrEmpty(token);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void putToken(Map<String,Object> attributes, CsrfToken token) {
|
||||||
if(token == null) {
|
if(token == null) {
|
||||||
attributes.remove(this.sessionAttributeName);
|
attributes.remove(this.sessionAttributeName);
|
||||||
} else {
|
} else {
|
||||||
attributes.put(this.sessionAttributeName, token);
|
attributes.put(this.sessionAttributeName, token);
|
||||||
}
|
}
|
||||||
return Mono.justOrEmpty(token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -70,9 +70,10 @@ public class WebSessionServerCsrfTokenRepositoryTests {
|
|||||||
CsrfToken token = new DefaultCsrfToken("h","p", "t");
|
CsrfToken token = new DefaultCsrfToken("h","p", "t");
|
||||||
String attrName = "ATTR";
|
String attrName = "ATTR";
|
||||||
this.repository.setSessionAttributeName(attrName);
|
this.repository.setSessionAttributeName(attrName);
|
||||||
Mono<Void> result = this.repository.saveToken(this.exchange, token);
|
Mono<CsrfToken> result = this.repository.saveToken(this.exchange, token);
|
||||||
|
|
||||||
StepVerifier.create(result)
|
StepVerifier.create(result)
|
||||||
|
.consumeNextWith(n -> assertThat(n).isEqualTo(token))
|
||||||
.verifyComplete();
|
.verifyComplete();
|
||||||
|
|
||||||
WebSession session = this.exchange.getSession().block();
|
WebSession session = this.exchange.getSession().block();
|
||||||
@ -86,7 +87,7 @@ public class WebSessionServerCsrfTokenRepositoryTests {
|
|||||||
CsrfToken token = new DefaultCsrfToken("h","p", "t");
|
CsrfToken token = new DefaultCsrfToken("h","p", "t");
|
||||||
this.repository.saveToken(this.exchange, token).block();
|
this.repository.saveToken(this.exchange, token).block();
|
||||||
|
|
||||||
Mono<Void> result = this.repository.saveToken(this.exchange, null);
|
Mono<CsrfToken> result = this.repository.saveToken(this.exchange, null);
|
||||||
StepVerifier.create(result)
|
StepVerifier.create(result)
|
||||||
.verifyComplete();
|
.verifyComplete();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user