Procházet zdrojové kódy

ServerRequestCache uses URI

Issue: gh-4789
Rob Winch před 7 roky
rodič
revize
1d9b0760d5

+ 0 - 2
web/src/main/java/org/springframework/security/web/server/authentication/RedirectServerAuthenticationSuccessHandler.java

@@ -56,8 +56,6 @@ public class RedirectServerAuthenticationSuccessHandler
 		Authentication authentication) {
 		ServerWebExchange exchange = webFilterExchange.getExchange();
 		return this.requestCache.getRequest(exchange)
-			.map(r -> r.getPath().pathWithinApplication().value())
-			.map(URI::create)
 			.defaultIfEmpty(this.location)
 			.flatMap(location -> this.redirectStrategy.sendRedirect(exchange, location));
 	}

+ 3 - 1
web/src/main/java/org/springframework/security/web/server/savedrequest/NoOpServerRequestCache.java

@@ -20,6 +20,8 @@ import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
+import java.net.URI;
+
 /**
  * @author Rob Winch
  * @since 5.0
@@ -31,7 +33,7 @@ public class NoOpServerRequestCache implements ServerRequestCache {
 	}
 
 	@Override
-	public Mono<ServerHttpRequest> getRequest(ServerWebExchange exchange) {
+	public Mono<URI> getRequest(ServerWebExchange exchange) {
 		return Mono.empty();
 	}
 

+ 3 - 1
web/src/main/java/org/springframework/security/web/server/savedrequest/ServerRequestCache.java

@@ -20,6 +20,8 @@ import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
+import java.net.URI;
+
 /**
  * Saves a {@link ServerHttpRequest} so it can be "replayed" later. This is useful for
  * when a page was requested and authentication is necessary.
@@ -42,7 +44,7 @@ public interface ServerRequestCache {
 	 * @param exchange the exchange to obtain the saved {@link ServerHttpRequest} from
 	 * @return the {@link ServerHttpRequest}
 	 */
-	Mono<ServerHttpRequest> getRequest(ServerWebExchange exchange);
+	Mono<URI> getRequest(ServerWebExchange exchange);
 
 	/**
 	 * If the provided {@link ServerWebExchange} matches the saved {@link ServerHttpRequest}

+ 6 - 2
web/src/main/java/org/springframework/security/web/server/savedrequest/WebSessionServerRequestCache.java

@@ -27,6 +27,8 @@ import org.springframework.web.server.ServerWebExchange;
 import org.springframework.web.server.WebSession;
 import reactor.core.publisher.Mono;
 
+import java.net.URI;
+
 /**
  * An implementation of {@link ServerRequestCache} that saves the
  * {@link ServerHttpRequest} in the {@link WebSession}.
@@ -68,16 +70,18 @@ public class WebSessionServerRequestCache implements ServerRequestCache {
 	}
 
 	@Override
-	public Mono<ServerHttpRequest> getRequest(ServerWebExchange exchange) {
+	public Mono<URI> getRequest(ServerWebExchange exchange) {
 		return exchange.getSession()
 			.flatMap(session -> Mono.justOrEmpty(session.<String>getAttribute(this.sessionAttrName)))
-			.map(path -> exchange.getRequest().mutate().path(path).build());
+			.map(URI::create);
 	}
 
 	@Override
 	public Mono<ServerHttpRequest> getMatchingRequest(
 		ServerWebExchange exchange) {
 		return getRequest(exchange)
+			.map(URI::toASCIIString)
+			.map(path ->  exchange.getRequest().mutate().path(path).build())
 			.filter( request -> pathInApplication(request).equals(
 				pathInApplication(exchange.getRequest())));
 	}

+ 6 - 4
web/src/test/java/org/springframework/security/web/server/savedrequest/WebSessionServerRequestCacheTests.java

@@ -22,6 +22,8 @@ import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
 import org.springframework.mock.web.server.MockServerWebExchange;
 import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatcher;
 
+import java.net.URI;
+
 import static org.assertj.core.api.Assertions.*;
 
 /**
@@ -36,9 +38,9 @@ public class WebSessionServerRequestCacheTests {
 		MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/secured/"));
 		this.cache.saveRequest(exchange).block();
 
-		ServerHttpRequest saved = this.cache.getRequest(exchange).block();
+		URI saved = this.cache.getRequest(exchange).block();
 
-		assertThat(saved.getURI()).isEqualTo(exchange.getRequest().getURI());
+		assertThat(saved).isEqualTo(exchange.getRequest().getURI());
 	}
 
 	@Test
@@ -55,9 +57,9 @@ public class WebSessionServerRequestCacheTests {
 		MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.post("/secured/"));
 		this.cache.saveRequest(exchange).block();
 
-		ServerHttpRequest saved = this.cache.getRequest(exchange).block();
+		URI saved = this.cache.getRequest(exchange).block();
 
-		assertThat(saved.getURI()).isEqualTo(exchange.getRequest().getURI());
+		assertThat(saved).isEqualTo(exchange.getRequest().getURI());
 	}
 
 	@Test