From 1634ce233f01b17b5e901ab352a4635985776b3a Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Thu, 7 Sep 2017 12:36:02 -0500 Subject: [PATCH] Add LoginPageGeneratingWebFilter Fixes gh-4531 --- .../ui/LoginPageGeneratingWebFilter.java | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 webflux/src/main/java/org/springframework/security/web/server/ui/LoginPageGeneratingWebFilter.java diff --git a/webflux/src/main/java/org/springframework/security/web/server/ui/LoginPageGeneratingWebFilter.java b/webflux/src/main/java/org/springframework/security/web/server/ui/LoginPageGeneratingWebFilter.java new file mode 100644 index 0000000000..baedd859b3 --- /dev/null +++ b/webflux/src/main/java/org/springframework/security/web/server/ui/LoginPageGeneratingWebFilter.java @@ -0,0 +1,101 @@ +/* + * + * * Copyright 2002-2017 the original author or authors. + * * + * * Licensed under the Apache License, Version 2.0 (the "License"); + * * you may not use this file except in compliance with the License. + * * You may obtain a copy of the License at + * * + * * http://www.apache.org/licenses/LICENSE-2.0 + * * + * * Unless required by applicable law or agreed to in writing, software + * * distributed under the License is distributed on an "AS IS" BASIS, + * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * * See the License for the specific language governing permissions and + * * limitations under the License. + * + */ + +package org.springframework.security.web.server.ui; + +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferFactory; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatcher; +import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatchers; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; + +import java.nio.charset.Charset; + +/** + * @author Rob Winch + * @since 5.0 + */ +public class LoginPageGeneratingWebFilter implements WebFilter { + private ServerWebExchangeMatcher matcher = ServerWebExchangeMatchers + .pathMatchers(HttpMethod.GET, "/login"); + + @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + return this.matcher.matches(exchange) + .filter(ServerWebExchangeMatcher.MatchResult::isMatch) + .switchIfEmpty(chain.filter(exchange).then(Mono.empty())) + .flatMap(matchResult -> render(exchange)); + } + + private Mono render(ServerWebExchange exchange) { + boolean isError = exchange.getRequest().getQueryParams().containsKey("error"); + ServerHttpResponse result = exchange.getResponse(); + result.setStatusCode(HttpStatus.FOUND); + result.getHeaders().setContentType(MediaType.TEXT_HTML); + byte[] bytes = createPage(isError); + DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory(); + DataBuffer buffer = bufferFactory.wrap(bytes); + return result.writeWith(Mono.just(buffer)) + .doOnError( error -> DataBufferUtils.release(buffer)); + } + + private static byte[] createPage(boolean isError) { + String page = "\n" + + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " Please sign in\n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + " \n" + + createError(isError) + + "

\n" + + " \n" + + " \n" + + "

\n" + + "

\n" + + " \n" + + " \n" + + "

\n" + + " \n" + + "
\n" + + "
\n" + + " \n" + + ""; + + return page.getBytes(Charset.defaultCharset()); + } + + private static String createError(boolean isError) { + return isError ? "
Invalid credentials
" : ""; + } +}